• Tidak ada hasil yang ditemukan

PDF Table of Contents

N/A
N/A
Protected

Academic year: 2023

Membagikan "PDF Table of Contents"

Copied!
242
0
0

Teks penuh

Controllers, middleware, and requests (a new type of class in Laravel 5.0) are now grouped under the application/Http directory, since they are all classes related to the HTTP transport layer of your application. In addition to the existing constructor injection, you can now inject dependencies on controller methods.

Authentication Scaffolding

User registration, authentication, and password reset controls are now included out of the box, as well as the corresponding simple views, which are located in resources/views/auth. In addition to the queued job format supported in Laravel 4, Laravel 5 allows you to represent your queued jobs as simple command objects.

Event Objects

Commands / Queueing

Of course, you can also use commands for tasks that run synchronously (not in a queue). Instead of various confusing, nested environment configuration directories, Laravel 5 now uses Vance's DotEnv.

Database Queue

In the past, developers created a Cron entry for each console command they wanted to schedule. The Laravel command scheduler allows you to fluidly and expressively define the command schedule within Laravel itself, requiring only one Cron entry on your server.

Laravel Scheduler

Your console schedule is no longer under source control and you need to SSH into your server to add Cron entries. The php artisan tinker command now uses Psysh by Justin Hileman, a more robust REPL for PHP.

Tinker / Psysh

The database queue driver is now included in Laravel and provides a simple, local queue driver that requires no additional package installation on top of your database software.

DotEnv

This library provides a super easy way to manage your environment configuration and makes environment detection in Laravel 5 a breeze.

Laravel Elixir

Laravel Socialite

Flysystem Integration

What's more, if the request is invalid, an HTTP redirect will be automatically issued that you can customize, and error messages will be flashed in the session or converted to JSON. If the validation fails, an exception will be thrown and an appropriate HTTP response will be automatically sent back to the browser.

Simple Controller Request Validation

This means that if your controller action is called, you can safely assume that the HTTP request input has been validated according to the rules you specified in your form request class. To compliment the new default application structure, new Artisan generator commands have been added to the framework.

New Generators

Once the Laravel IoC container recognizes that the class it is injecting is an instance of FormRequest, the request will be made. If the request was an AJAX request, Laravel even takes care of sending a JSON representation of validation errors back.

Configuration Cache

The popular dd helper function which dumps variable debugging information has been upgraded to use the amazing Symfony VarDumper. The full changelist for this release by running the php artisan change command from a 4.2 installation or by viewing.

Symfony VarDumper

Requirement

Laravel Forge

Laravel Homestead

Laravel Cashier

Daemon Queue Workers

Mail API Drivers

Full list of changes for this release by running the php artisan changes command from a 4.1 installation or by viewing the changelog on Github. The php artisan tinker command now uses the Boris REPL if your system supports it.

Soft Deleting Traits

This new architecture allows for easier construction of similar global features and a cleaner separation of concerns within the framework itself. A new simplePaginate method was added to the Eloquent query and builder, which allows for more efficient queries when using simple "Next" and "Previous" links in your page view.

Convenient Auth & Remindable Traits

The default Laravel 4.2 installation now uses simple properties to include the necessary properties for authentication UIs and password reminders. Automatic handling of separate read/write connections is now available throughout the database layer, including the query builder and Eloquent.

34;Simple Paginate"

A new whereHas method has also been introduced to allow retrieving models based on relational constraints.

Migration Confirmation

Full Change List

New SSH Component

Boris In Tinker

Eloquent Improvements

Database Read / Write Connections

The queuing facilities now include automatic handling of failed jobs when using the new --tries switch on queue:listen. The password reminder engine has been changed to provide more flexibility for developers when validating passwords, flashing status messages to the session, etc.

Queue Priority

Priority queue types are now supported by passing a comma-separated list to the queue:listen command. The entire engine has been greatly simplified, and the dependency on Symfony Routing has been reduced to composing route expressions.

Failed Queue Job Handling

We are no longer using Symfony's session handling facilities (and therefore PHP) and are using a custom solution that is simpler and easier to maintain. If you use the renameColumn function in your migrations, you will need to add the doctrine/dbal dependency to your .

Cache Tags

Cache tags allow you to assign multiple "tags" to a cache item and delete all items assigned to a single tag.

Flexible Password Reminders

Improved Routing Engine

Improved Session Engine

Doctrine DBAL

Copy the new .env.example file to .env , which is the 5.0 equivalent of the old .env.php file. Instead, move any configuration values ​​that vary by environment to .env , and then access them in your site.

Upgrade Guide

Upgrading To 5.0 From 4.2

Fresh Install, Then Migrate

Composer Dependencies & Packages

Namespacing

Configuration

Migrating Environment Variables

Configuration Files

Copy and paste your old routes.php file into your new app/Http/routes.php. You can then remove the namespace from the abstract base class app/Http/Controllers/Controller.php.

Routes

Since we won't be migrating to the full namespace in this guide, add the app/Http/Controllers folder to the classmap directive of your composer.json file. Copy your filter bindings from app/filters.php and place them in the boot() method of.

Controllers

Set the configuration files in the config/ folder to display values ​​that are consistent across all your environments, or set them to use env() to load values ​​that vary from environment to environment. Note that if you add more keys to the .env file, you will also need to add sample values ​​to the .env.example file.

Route Filters

You don't need to move any of the default Laravel 4.0 filters like auth and csrf; they are all here, but as middleware. Edit any routes or controllers that reference the old default filters (eg ['before' => 'auth'] ) and change them to refer to the new middleware (eg

Global CSRF

Eloquent Models

Then add the app/Console/Commands folder to the classmap directive of your composer.json file. Then copy your list of Artisan commands from start/artisan.php into the command set of app/Console/Kernel.php.

Eloquent Caching

Move all your command classes from your old app/commands folder to the new app/console/commands folder. Move all your migration classes from the old app/database/migrations folder to the new database/migrations.

User Authentication Model

If you have used them, remove Illuminate\Auth\Reminders\RemindableTrait and Illuminate\Auth\UserTrait from your usage block and your class declaration. Remove the two migrations that came with Laravel 5.0, as you should already have the users table in your database.

Cashier User Changes

Artisan Commands

Database Migrations & Seeds

If you have any IoC bindings in start/global.php, move them all to the register method for. However, if you need to use the old Blade syntax, add the following lines at the bottom of the AppServiceProvider@register.

Global IoC Bindings

This should not be done lightly and can make your application more vulnerable to XSS exploits. Copy your application's public assets from the public folder of your 4.2 application to the public folder of your new application.

Views

If you are using form or HTML helpers, you will see an error stating that the 'Form' class was not found or that the 'Html' class was not found.

Blade Tag Changes

Translation Files

Public Directory

Tests

Misc. Files

If your application code was injecting Illuminate\Cache\CacheManager to get a non-Facade version of Laravel's cache, inject it. Note: In Laravel 4.2, the default cipher is MCRYPT_RIJNDAEL_128 (AES), which is considered to be the most secure cipher.

CacheManager

This setting can be used to control the default encryption used by the Laravel encryption facilities. Changing the cipher back to MCRYPT_RIJNDAEL_256 is required to decrypt cookies/values ​​that were encrypted in Laravel <= 4.1.

Pagination

Beanstalk Queuing

Remote

Workbench

Upgrading To 4.2 From 4.1

Encryption Defaults

Soft Deleting Models Now Use Traits

If you use the fillable property on your models to protect against bulk assignment, your application is not vulnerable. However, if you use protected and pass a user-controlled array to an "update" or "save" type function, you should upgrade to 4.1.29 immediately, as your application may be at risk of bulk allocation.

View / Pagination Environment Renamed

If you refer directly to the Illuminate\View\Environment class or the Illuminate\Pagination\Environment class, update your code to reference Illuminate\View\Factory and Illuminate\Pagination\Factory instead. This protects your application from some mass assignment vulnerabilities when you don't use the fillable property on models.

Additional Parameter On Pagination Presenter

Iron.Io Queue Encryption

After this change, the user will be assigned a new token each time they log into your app. To upgrade your app to Laravel 4.1, change your laravel/framework version to 4.1.* in your composer.json file.

Upgrade Path

This change requires adding a new memory_token column to your users database table (or equivalent). First, add a new, null memory_token of VARCHAR(100), TEXT, or equivalent to your users table.

Package Maintainers

Note: All existing "remember me" sessions will be invalidated by this change, so all users will be forced to re-authenticate with your application. Make sure to add your custom and package service providers / aliases back to the arrays.

Upgrading To 4.1 From 4.0

The implications of this change are: If a "remember me" cookie is hijacked, simply logging out of the application will invalidate the cookie. The Illuminate\Auth\UserInterface also received the three new methods described in the "Upgrade Path".

Upgrading Your Composer Dependency

Replacing Files

Adding Configuration Files & Options

Add a new expire_on_close configuration option to the app/config/session.php file. Optional) Update the pagination configuration option in the app/config/view.php file to pagination::slider-3.

Controller Updates

If app/controllers/BaseController.php has a use statement at the top, change use Illuminate\Routing\Controllers\Controller; to Illuminate\Routing\Controller; to use. This method is no longer necessary as this functionality is now handled by the .htaccess file included with the framework.

Password Reminders Updates

For security reasons, URL domains may no longer be used to locate your application environment. Once you have completed the changes above, you can run the composer update function to update your core application files.

Environment Detection Updates

You must convert your environment detection to use machine hostnames (hostname command on Mac, Linux, and Windows).

Simpler Log Files

Removing Redirect Trailing Slash

Current Route Access

If you get classload errors, try running the update command with the --no-scripts option enabled like so:.

Composer Update

Wildcard Event Listeners

Discussion regarding bugs, new features and implementation of existing features takes place in the #laravel-dev IRC channel (Freenode). Bug fixes should never be pushed to the master branch unless they fix features that only exist in the upcoming release.

Contribution Guide

Bug Reports

Core Development Discussion

Which Branch?

Security Vulnerabilities

Coding Style

Setup

Make sure to put the ~/.composer/vendor/bin folder in your PATH so that the laravel executable can be found by your system. Once installed, the simple laravel new command will create a new Laravel installation in the directory you specify.

Installation

Install Composer

Install Laravel

Via Laravel Installer

Via Composer Create-Project

Server Requirements

The first thing you need to do after installing Laravel is to set your application key to a random string. The framework ships with a public/.htaccess file that is used to allow URLs without index.php.

Permissions

It contains several options such as time zone and locale which you may want to change according to your application. Note: You should never have the app.debug configuration option set to true for a production application.

Pretty URLs

If you installed Laravel via Composer, this key is probably already set for you with the key:generate command. If the application key is not set, your user sessions and other encrypted data will not be secure.

Apache

Laravel may require certain permissions to be configured: folders within storage require write access by the web server. If you are using Apache to serve your Laravel application, make sure to enable the mod_rewrite module.

Nginx

Introduction

After Installation

Naming Your Application

Other Configuration

Accessing Configuration Values

In a fresh Laravel installation, the root directory of your application will contain an .env.example file. If you are developing with a team, you may want to continue to include an .env.example file with your application.

Environment Configuration

For example, you may want to use a different cache manager locally than you do on your production server. All the variables listed in this file will be loaded into the $_ENV PHP super-global when your application receives a request.

Accessing The Current Application Environment

To give your application a little speed boost, you can cache all your configuration files in a single file with the . When your application is in maintenance mode, a custom view will be displayed for all requests in your application.

Configuration Caching

This will combine all the configuration options for your application into a single file that can be quickly loaded by the framework. This makes it easy to "disable" your application while it's updating or when performing maintenance.

Maintenance Mode

The default template for maintenance mode responses is located in resources/views/errors/503.blade.php. The tasks will continue to be handled as normal once the application is out of maintenance mode.

Maintenance Mode Response Template

Maintenance Mode & Queues

Included Software

Installation & Setup

Installing VirtualBox & Vagrant

Adding The Vagrant Box

Once you have installed the Homestead CLI tool, run the bash init.sh command to create the Homestead.yaml. Be sure to put the ~/.composer/vendor/bin directory in your PATH so that the homestead executable is found when you run the homestead command in your terminal.

Installing Homestead

In this file you can configure the path to your SSH public key, as well as the directories you want to share between your main machine and the Homestead virtual machine.

Manually Via Git (No Local PHP)

With Composer + PHP Tool

Set Your SSH Key

The folders property of the Homestead.yaml file lists all the folders you want to share with your Homestead environment. Once you've edited Homestead.yaml to your liking, run the vagrant up command from your Homestead directory.

Configure Your Shared Folders

Once you've created an SSH key, specify the key's path in the authorization property of your Homestead.yaml file. Make sure the IP address listed is the one you set in your Homestead.yaml file.

Configure Your Nginx Sites

To add Bash aliases to your Homestead box, simply add to the aliases file in the root of the ~/.homestead directory. The hosts file will redirect your requests for the local domains to your Homestead environment.

Bash Aliases

On Windows, you can install Git and use the Git Bash shell included with Git to issue the above command. The site property allows you to easily map a "domain" to a folder in your Homestead environment.

Launch The Vagrant Box

As files within these folders are changed, they will be kept in sync between your local machine and the Homestead environment. Don't forget to add the "domains" for your Nginx sites to the hosts file on your computer.

Daily Usage

You can make any Homestead site use HHVM by setting the hhvm option to true. Vagrant will boot the virtual machine and automatically configure your shared folders and Nginx websites.

Connecting Via SSH

To connect to your Homestead environment via SSH, issue the vagrant ssh command from your Homestead directory. There are two ways to do this: First, you can simply add the sites to your Homestead.yaml file and then run vagrant provision.

Connecting To Your Databases

Once you create this alias, you can simply use the "vm" command to SSH into your Homestead machine from anywhere on your system. Once your Homestead environment is up and running, you may want to add additional Nginx sites for your Laravel applications.

Adding Additional Sites

To connect to your MySQL or Postgres database from your main machine via Navicat or Sequel Pro, you need to connect to. Note: After running the serve command, don't forget to add the new site to the hosts file on your main computer.

Ports

Note: You should only use these non-standard ports when connecting to the databases from your main computer. You use the default ports 3306 and 5432 in your Laravel database configuration file, since Laravel runs within the virtual machine.

The Basics

Basic Route Protection Mode CSRF Named Spoof Route Parameters Route Groups Route Groups Link Route Pattern Throw 404 Middleware Errors. Basic CSRF Routing Protection Mode Forged Route Parameters Route Groups Route Groups Link Route Pattern Throw 404 errors.

HTTP Routing

Basic Routing

Basic GET Route

Other Basic Routes Route

Registering A Route For Multiple Verbs

Registering A Route That Responds To Any HTTP Verb

You do not need to manually verify the CSRF token on POST, PUT, or DELETE requests. So when you define PUT or DELETE routes that are called from an HTML form, you must add a hidden _method field to the form.

CSRF Protection

Cross-site request spoofing is a type of malicious exploit that executes unauthorized commands on behalf of an authenticated user. In addition to looking for the CSRF token as a "POST" parameter, the middleware will also check for the X-XSRF-TOKEN.

Insert The CSRF Token Into A Form

This token is used to verify that the authenticated user is the one actually making the requests to the application. The VerifyCsrfToken HTTP middleware verifies that the token in the request input matches the token stored in the session.

Route Parameters

The value sent with the _method field will be used as the method of the HTTP request.

Basic Route Parameter

Optional Route Parameters

If you want a route parameter to always be constrained by a certain regular expression, you can use the pattern. To access a route parameter value outside a route, use the input method:.

Optional Route Parameters With Default Value

Regular Expression Parameter Constraints

Passing An Array Of Constraints

Defining Global Patterns

Accessing A Route Parameter Value

The request instance for the current request can be accessed via the Request facade or by typing in Illuminate\Http\Request where.

Named Routes

Route Groups

Note: By default, the RouteServiceProvider includes your routes.php file in a namespace group, allowing you to register controller routes without specifying the full namespace.

Sub-Domain Routing

Registering Sub-Domain Routes

Route Prefixing

Route Model Binding

Binding A Parameter To A Model

Note: If a matching model instance is not found in the database, a 404 error will be thrown. If you want to use your own resolution logic, use the Router::bind method.

Throwing 404 Errors

Since we bound the {user} parameter to the App\User model, the User instance will be inserted into the path. For more information on handling 404 exceptions and using custom responses for these errors, see the Errors section of the documentation.

HTTP Middleware

Defining Middleware

If you want to assign the middleware to specific paths, you must first assign the middleware a shortcut to your. By default, the $routeMiddleware property of this class contains entries for the middleware included with Laravel.

Registering Middleware

If you want a middleware to be executed during every HTTP request to your application, simply list the middleware class in the . Once you have defined a terminating middleware, you must add it to the list of global middleware in your HTTP core.

Global Middleware

Sometimes the middleware needs to do some work after the HTTP response has already been sent to the browser. For example, the "session" middleware included in Laravel writes session information to storage after the response has been sent to the browser.

Assigning Middleware To Routes

It's best to imagine middleware as a series of "low" HTTP requests to go through before hitting your application. To add your own, simply add it to this list and assign it a key of your choice.

Terminable Middleware

It is very important to note that we did not need to specify the entire controller namespace, only the part of the class name that is after the App\Http\Controllers "root" namespace. If you choose to nest or organize your controllers using PHP namespaces deeper in the App\Http\Controllers directory, simply use the specific class name relative to the root App\Http\Controllers namespace.

HTTP Controllers

Basic Controllers

Controllers & Namespaces

Naming Controller Routes

URLs To Controller Actions

Controller Middleware

Implicit Controllers

The first is the base URI that the controller processes, while the second is the class name of the controller. If your controller action contains multiple words, you can access the action using the "dash" syntax in the URI.

RESTful Resource Controllers

The index methods will respond to the root URI handled by the controller, which in this case is users. This single route statement creates multiple routes to handle a variety of RESTful actions on the photo resource.

Actions Handled By Resource Controller

For example, you might want to create a controller that handles HTTP requests for "photos" stored by your application. By default, all resource controller actions have a path name; however, you can override these names by passing names.

Customizing Resource Routes

If it becomes necessary to add additional routes to a resource controller beyond the default resource routes, you must define those routes before your call to Route::resource.

Handling Nested Resource Controllers

Adding Additional Routes To Resource Controllers

In addition to constructor injection, you can also type dependencies on your controller's methods. If your controller method also expects a route parameter input, simply list your route arguments after your other dependencies:.

Dependency Injection & Controllers

Constructor Injection

If your application uses controller routes exclusively, you can take advantage of Laravel's route cache. Using the route cache will drastically reduce the amount of time it takes to register all of your application's routes.

Route Caching

Your cached routes file will now be used instead of your app/Http/routes.php file. Remember that if you add new routes, you must generate a new route cache.

HTTP Requests

Obtaining A Request Instance

Via Facade

Via Dependency Injection

Using a few simple methods, you can access all user input from your Illuminate\Http\Request instance. For example, you may need to refill a form after checking it for validation errors.

Retrieving Input

You don't need to worry about the HTTP verb used for the request, since input is achieved the same way for all verbs.

Retrieving An Input Value

Retrieving A Default Value If The Input Value Is Absent

Determining If An Input Value Is Present

Getting All Input For The Request

Getting Only Some Of The Request Input

Old Input

Since you'll often want to blink input in conjunction with a redirect, you can easily chain a blinking input to a redirect. To retrieve the input blink from a previous request, use the old method on the Request instance.

Flashing Input To The Session

All cookies generated by the Laravel framework are encrypted and signed with an authentication code, meaning they will be considered invalid if modified by the client.

Flashing Only Some Input To The Session

Flash & Redirect

Retrieving Old Data

Cookies

Retrieving A Cookie Value

Attaching A New Cookie To A Response

The cookie helper serves as a simple factory for generating new instances of Symfony\Component\HttpFoundation\Cookie. The object returned by the File method is an instance of the Symfony\Component\HttpFoundation\File\UploadedFile class, which extends the PHP SplFileInfo class and provides various methods for interacting with the file.

Creating A Cookie That Lasts Forever*

The Request class provides many HTTP request handling methods for your application and extends it.

Files

Retrieving An Uploaded File

Determining If A File Was Uploaded

Determining If An Uploaded File Is Valid

Moving An Uploaded File

Other File Methods

Other Request Information

Retrieving The Request URI

Retrieving The Request Method

Determining If The Request Path Matches A Pattern

Get The Current Request URL

However, for most routes and controller actions, you return a full Illuminate\Http\Response instance or a view.

HTTP Responses

Basic Responses

Returning Strings From Routes

Creating Custom Responses

Sending A View In A Response

Attaching Cookies To Responses

You may want to redirect the user to their previous location, for example, after submitting a form. If your route has parameters, you can pass them as the second argument to the route method.

Redirects

Redirect responses are typically instances of the Illuminate\Http\RedirectResponse class and contain the correct headers needed to redirect the user to another URL. Redirecting to a new URL and flashing data to the session typically happen at the same time.

Returning A Redirect

When you call the redirection helper without parameters, an instance of Illuminate\Routing\Redirector is returned, allowing you to call any method on the Redirector instance.

Returning A Redirect With Flash Data

Redirecting To The Previous URL

Returning A Redirect To A Named Route

Returning A Redirect To A Named Route With Parameters

If you are redirecting to a route with an "ID" parameter that is being populated by an Eloquent template, you can simply pass the template itself. Note: You do not need to specify the full namespace for the controller if you have registered a root controller namespace via URL::setRootControllerNamespace.

Returning A Redirect To A Named Route Using Named Parameters

When the response helper is called with no arguments, the Illuminate\Contracts\Routing\ResponseFactory contract implementation is returned.

Returning A Redirect To A Controller Action

Returning A Redirect To A Controller Action With Parameters

Returning A Redirect To A Controller Action Using Named Parameters

Other Responses

Creating A JSON Response

Creating A JSONP Response

If you would like to define a custom response that you can reuse in a number of your routes and controllers, you can use the macro method on an Illuminate\Contracts\Routing\ResponseFactory implementation. The macro's closure will be executed when the macro name is called from a ResponseFactory implementation or the response helper:.

Creating A File Download Response

Response Macros

Basic Usage

Passing Data To Views

Sharing Data With All Views

You have several options: the view helper, the Illuminate\Contracts\View\Factory contract, or a wildcard view composer. Note: When the viewhelper is called without arguments, it returns an implementation of the .

Determining If A View Exists

Sometimes you may need to share a piece of data with all views rendered by your application. You are free to add them to the AppService Provider or generate a separate service provider to host them.

Returning A View From A File Path

View Composers

Defining A View Composer

Just before the view is rendered, the composer's compose method is called with Illuminate\Contracts\View\View. The composer method accepts the * character as a wildcard, so you can attach a composer to all views like this:.

Wildcard View Composers

Note: All view composers are resolved via the service container, so you can write any dependencies you need inside a composer's constructor. You can use the composers method to register a group of composers at the same time:.

Attaching A Composer To Multiple Views

Defining Multiple Composers

View Creators

Architecture Foundations

Service Providers

Basic Provider Example

The Register Method

This class is namespace under App\Providers because that is the default location for service providers in Laravel. This file contains an array of providers where you can specify the names of your service providers.

The Boot Method

If you don't understand how the service container works, don't worry, we'll cover it soon. This method is called after all other service providers have been registered, which means you have access to all other services that have been registered by the framework.

Registering Providers

If your provider only registers bindings in the service container, you can choose to delay its registration until one of the registered bindings is actually needed. Then only when you try to resolve one of these services does Laravel load the service provider.

Deferred Providers

We can also easily "mock" the mailer or create a dummy implementation while testing our application. An in-depth understanding of the Laravel service container is essential for building a powerful, large application, as well as for contributing to the Laravel core itself.

Service Container

Inside a service provider, you always access the container via the $this->app instance variable. You can also bind an existing object instance into the container using the instance method.

Binding

Almost all of your service container bindings will be registered with service providers, so all of these examples will demonstrate the use of the container in that context. However, if you need an instance of the container somewhere else in your application, such as a factory, you can write hints on the Illuminate\Contracts\Container\Container contract and an instance of the container will be injected for you.

Registering A Basic Resolver

There are several ways the service container can register dependencies, including closure callbacks and binding interfaces to implementations. Finally, but most importantly, you can simply "type hint" the dependency in the constructor of a class that is resolved by the .

Registering A Singleton

Binding An Existing Instance Into The Container

Resolving

A very powerful feature of the service container is its ability to bind an interface to a given implementation. For example, perhaps our application integrates with the Pusher web service for sending and receiving real-time events.

Binding Interfaces To Implementations

Injecting Concrete Dependencies

In this example it is good that we inject the class dependencies; however, we are tightly coupled to the Pusher SDK. If the Pusher SDK methods change or we decide to completely switch to a new event service, we will have to change ours.

Program To An Interface

This tells the container to inject a Pusher Event Pusher when a class needs an EventPusher implementation.

Contextual Binding

Laravel provides several options to use the service container to increase the flexibility and testability of your application. All controllers are resolved through the service container, meaning you can write dependencies in a controller constructor and they will be injected automatically.

Tagging

Practical Applications

Of course, as mentioned above, controllers are not the only classes that Laravel resolves through the service container. For examples of using the service container in these contexts, see the associated documentation.

Other Examples Of Container Usage

An OrderRepository can be bound to a container in unit testing, allowing the database layer interaction to be closed painlessly. You can also provide hints about route closure dependencies, filters, queued tasks, event listeners, and more.

Container Events

Registering A Resolving Listener

Laravel's Contracts are a set of interfaces that define the core services provided by the framework.

Contracts

Why Contracts?

Loose Coupling

It is closely related because we depend on a concrete Cache class from a package vendor. Additionally, relying on simple interfaces makes your code easier to understand and maintain.

Simplicity

Similarly, if we want to replace our underlying cache technology (Memcached) with another technology (Redis), we will need to change our repository again. When all of Laravel's services are precisely defined within simple interfaces, it is very easy to specify the functionality that a particular service provides.

Contract Reference

How To Use Contracts

Facades

Explanation

Practical Usage

When the user references any static method on the cache facade, Laravel resolves the cache binding from the IoC container and runs the requested method (get in this case) against that object. Remember that if you use a facade when the controller is in the namespace, you will need to import the facade class into the namespace.

Importing Facades

Creating Facades

You can then configure Laravel to load your service provider from config/app.php. Finally, if we want, we can add an alias for our facade to the alias array in the config/app.php configuration file.

A Note On Auto-Loading Aliases

A great place to register this binding would be to create a new service provider called PaymentServiceProvider and add this binding to the register method. The classes in the alias set are not available in some cases because PHP will not attempt to automatically load undefined classes of the hinted type.

Mocking Facades

Facade Class Reference

The first action taken by Laravel itself is to create an instance of the application / service container. All the service providers for the application are configured in the config/app.php configuration file's providers array.

Request Lifecycle

Lifecycle Overview

First Things

HTTP / Console Kernels

Once the application has been bootstrapped and all service providers have been registered, the request will be handed off to the router for dispatch. The application instance is created, the service providers are registered, and the request is passed to the bootstrapped application.

Dispatch Request

The router will send the request to a route or controller, as well as run any route-specific middleware. It is very valuable to have a solid understanding of how a Laravel application is built and secured via service providers.

Focus On Service Providers

This provider is a great place to add your app's own bootstrap and service container bindings. The storage directory contains compiled Blade templates, file-based sessions, file cache, and other files generated by the framework.

Application Structure

The Root Directory

The App Directory

The Exception directory contains your application's exception handler and is also a good place to hold any exceptions thrown by your application. As discussed above, the default application namespace is App ; however, you can change this namespace to match the name of your application, which is easily done via the app:name Artisan command.

Namespacing Your Application

Note: Many of the classes in the application directory can be generated by Artisan via commands. To review the available commands, run the php artisan list make command in your terminal.

Services

Introduction Setup Subscribe to a plan No card upfront Exchange subscriptions Subscription Quantity Cancel a subscription Resume a subscription Check subscription status Handle failed payments Handle other invoices Stripe Webhooks. Basic Usage Controller Validation Form Validation Request Working with Error Messages Error Messages and Views Available Validation Rules Adding Conditional Rules Custom Error Messages Custom Validation Rules.

Authentication

Authenticating Users

The User Registrar

Manual Authentication

The other values ​​in the array will be used to find the user in your database table. So, in the example above, the user will be retrieved by the value of the email column.

Authenticating A User With Conditions

If the user exists, the hashed password stored in the database will be compared to the hashed password value passed to the method via the array. If the two hashed passwords match, a new authenticated session will be started for the user.

Determining If A User Is Authenticated

The intended redirect function will redirect the user to the URL they were trying to access before they were caught by the authentication filter. If you want to provide a "remember me" feature in your application, you can pass a boolean value as the second argument to the try method, which will keep the user authenticated indefinitely or until they manually log out.

Authenticating A User And "Remembering" Them

Of course, your users table must contain the 'remember_token' column, which will be used to store the "remember me". If you "remember" users, you can use the viaRemember method to determine if the user was authenticated using the.

Authenticating Users By ID

You can also use the one-time method to log a user into the application for a single request. Of course, if you are using Laravel's built-in authentication controllers, a controller method that handles user exit from the application is provided out of the box.

Validating User Credentials Without Login

Logging A User In For A Single Request

Manually Logging In A User

Logging A User Out Of The Application

If the authentication attempt is successful and the user is logged in, the auth.login event will also fire. Once a user has been authenticated, there are several ways to obtain a User instance.

Authentication Events

Retrieving The Authenticated User

You can also use Basic HTTP Authentication without setting a user identification cookie in the session, which is particularly useful for API authentication. If you are using PHP FastCGI, basic HTTP authentication may not work properly out of the box.

Protecting Routes

HTTP Basic Authentication

Protecting A Route With HTTP Basic

Setting Up A Stateless HTTP Basic Filter

Your user will receive an email with a link pointing to the PasswordController's getReset method. This method will display the password reset form and allow users to reset their passwords.

Password Reminders & Reset

To start, make sure your user model implements the Illuminate\Contracts\Auth\CanResetPassword contract. After resetting the password, the user will be automatically logged into the application and redirected to /home.

Model & Table

Laravel also includes an Auth\PasswordController that contains the logic needed to reset user passwords. In addition to typical, forms-based authentication, Laravel also provides a simple and convenient way to authenticate with OAuth providers using Laravel Socialite.

Generating The Reminder Table Migration

The user model provided with the framework obviously already implements this interface and uses the . You can change this via the reminder.expire option of your config/auth.php file.

Password Reminder Controller

The migration for this table is included with Laravel out of the box and is located in the database/migrations directory. You can customize the redirection location after reset by defining a redirectTo property on the PasswordController.

Social Authentication

You will need two routes: one to redirect the user to the OAuth provider and one to receive a callback from the provider after authentication. The redirect method takes care of sending the user to the OAuth provider, while the user method will read the incoming request and retrieve the user information from the provider.

Retrieving User Details

For example, to add the column to the users table, use php artisan cashier:table users.

Composer

Service Provider

Migration

Model Setup

If your plan has a trial set up in Stripe, the trial end date will also be automatically set on the user's record. If your app offers a free trial without a credit card up front, set the cardUpFront property on your template to false.

Stripe Key

If you want to specify additional customer information, you can do so by passing it as the second argument to the creation.

Subscribing To A Plan

Specifying Additional User Details

No Card Up Front

When a subscription is canceled, Cashier will automatically set the subscription_ends_at column in your database. If the user cancels a subscription and then resumes it before the subscription has fully expired, they will not be billed immediately.

Swapping Subscriptions

For example, if a customer cancels a subscription on March 1st, but the subscription was not scheduled to end until March 5th, the subscribed method will continue to return true until March 5th. Their subscription will simply be reactivated and they will be billed in their original billing cycle.

Subscription Quantity

Cancelling A Subscription

Resuming A Subscription

Checking Subscription Status

To determine if the user was once an active subscriber but has canceled their subscription, you can use the cancelled. If a user e.g. canceling a subscription on March 5th that was scheduled to end on March 10th, the user is on their "grace period" until March 10th.

Handling Failed Payments

No worries – Cashier includes a Webhook controller that makes it easy to unsubscribe a customer for you. Note: In addition to updating the subscription information in your database, the Webhook controller will also cancel the subscription via the Stripe API.

Handling Other Stripe Webhooks

If you have additional Stripe webhook events that you want to handle, simply extend the Webhook controller. Your method names should match Cashier's expected convention. Specifically, the methods must be prefixed with handle and the name of the Stripe webhook you want to process.

Invoices

Cache

Cache Usage

Storing An Item In The Cache

Using Carbon Objects To Set Expire Time

Storing An Item In The Cache If It Doesn't Exist

Checking For Existence In Cache

Retrieving An Item From The Cache

Sometimes you may want to uncache an item, but also save a default value if the requested item does not exist. Please note that all cached items are serialized, so you are free to store any type of data.

Retrieving An Item Or Returning A Default Value

Storing An Item In The Cache Permanently

Pulling An Item From The Cache

Removing An Item From The Cache

Increments & Decrements

Incrementing A Value

You can use any caching method in combination with tags, including remember , forever , and remember Forever . You can also access cached items from the marked cache as well as use other cache methods such as increment and .

Decrementing A Value

Furthermore, when using multiple tags with cache stored "forever", performance will be best with a driver such as memcached , which automatically cleans up stale records. Cache tags allow you to tag related items in the cache, then flush all caches tagged with a given name.

Accessing A Tagged Cache

Accessing Items In A Tagged Cache

Database Cache

Of course, collections of Eloquent objects are always returned as Collection instances; however, you should feel free to use the Collection class wherever appropriate for your application. Rather than listing all the methods (there are many) that the Collection makes available, see the API documentation for the class.

Collections

The Illuminate\Support\Collection class provides a fluid and convenient wrapper for working with datasets. As you can see, the Collection class allows you to chain its methods to perform fluent mapping and reduction of the underlying set.

Creating Collections

As mentioned above, the collection helper will return a new Illuminate\Support\Collection instance for the given array.

Explore The Collection

For example, we may need to charge the user's credit card, add a record to our database representing the purchase, and send a confirmation email of the purchase. Second, it is difficult to reuse the purchase podcast logic outside of the control context.

Command Bus

Creating Commands

The handler method can also type dependencies, and these will be automatically injected by the IoC container. The command socket will take care of executing the command and call the IoC container to inject any necessary dependencies into the handler method.

Dispatching Commands

If you want to get an instance of the command bus through the constructor of any of your classes, you can write the hint.

Mapping Command Properties From Requests

So if our command class accepts a firstName variable in its constructor, the command bus will attempt to retrieve the firstName parameter from the HTTP request. When you send it to the bus, that bus will automatically queue the job for background processing.

Queued Commands

This method will examine the constructor of the command class it is given, and then extract variables from the HTTP request (or any other ArrayAccess object) to populate the required constructor parameters for the command. The command bus is not only for synchronous jobs that run during the current request cycle, but also serves as the primary way to build queued jobs in Laravel.

Command Pipeline

Note: Take a moment to explore the various Manager classes that ship with Laravel, such as the CacheManager and. To extend the Laravel cache facility, we will use the extend method on the CacheManager, which is used to bind a custom driver resolver to the manager, and is common to all manager classes.

Extending The Framework

Managers & Factories

Session

Where To Extend The Session

Writing The Session Extension

The validateCredentials method must compare the given $user with the $credentials to authenticate the user. For example, this method can compare the string $user->getAuthPassword() with a Hash::make of $credentials['password'].

IoC Based Extension

Almost every service provider included in the Laravel framework binds objects in the IoC container. You can find a list of your app's service providers in the config/app.php configuration file.

Installing Node

Gulp

Usage

Compile Less

In the example above, Elixir assumes that your Less files are stored in resources/assets/less.

Compile Sass

Compile CoffeeScript

Compile All Less and CoffeeScript

Trigger PHPUnit Tests

Trigger PHPSpec Tests

Combine Stylesheets

Combine Stylesheets and Save to a Custom Directory

The third argument to both stylesheet and script methods defines the relative directory for all paths passed to the method.

Combine Stylesheets From A Custom Base Directory

Combine All Styles in a Directory

Combine Scripts

Combine All Scripts in a Directory

Combine Multiple Sets of Scripts

Version / Hash A File

Within your views, you can use the elixir() function to load the appropriately hashed item. Behind the scenes, the elixir() function determines the name of the hashed file to include.

Copy a File to a New Location

Copy an Entire Directory to a New Location

Execute All Registered Tasks Once

Watch Assets For Changes

Watch Tests And PHP Classes for Changes

Imagine you want to add a fun task that uses the Terminal to verbally notify you with a message. You can place this at the top of your Gulpfile, or extract it to a custom tasks file instead.

Extensions

These lines indicate that when any file matching the regex, **/*.php is modified, we want to trigger the message task. Note: Make sure to set a random string of 16, 24 or 32 characters in the key option of the config/app.php file.

Encryption

Encrypting A Value

Decrypting A Value

Setting The Cipher & Mode

The amount of error detail your app displays through the browser is controlled by the app.debug configuration option in your config/app.php configuration file. By default, this configuration option is set to respect the APP_DEBUG environment variable, which is stored in your .env file.

Errors & Logging

By default, the logger is configured to use daily log files; however, you can adjust this behavior as needed. However, you are free to customize the logging for your application as you wish by overriding the ConfigureLogging bootstrapper class.

Error Detail

Handling Errors

By default, the exception is passed to the base class, which generates the response for you. The exception handler's dontReport property contains an array of exception types that will not be logged.

HTTP Exceptions

The render method is responsible for converting the exception into an HTTP response that must be sent back to the browser. However, you are free to control the exception type or return your own custom response.

Custom 404 Error Page

By default, Laravel is configured to create daily log files for your application that are stored in the storage/logs folder.

Logging

Registering A Log Event Listener

Events

Subscribing To An Event

Firing An Event

If no exception is thrown when the handler is executed on the queue, the queued job will be automatically deleted after processing. If you need to manually access the delete and release methods of a queued job, you can do so.

Closure Listeners

Now when this handler is called for an event, it is automatically queued by the event dispatcher. If you have an existing handler that you want to convert to a queued handler, simply add the ShouldBeQueued interface to the class manually.

Stopping The Propagation Of An Event

Queued Event Handlers

Event Subscribers

Event subscribers are classes that can subscribe to multiple events from within the class itself.

Defining An Event Subscriber

Registering An Event Subscriber

Laravel provides a great file system abstraction thanks to the Flysystem PHP package by Frank de Jonge. When using the local driver, note that all file operations are relative to the root directory defined in your configuration file.

Filesystem / Cloud Storage

Even better, it's surprisingly easy to switch between these storage options because the API remains the same for each system. You can of course configure as many drives as you want, and you can even have multiple drives using the same driver.

Retrieving A Particular Disk

The Laravel Flysystem integration provides easy-to-use drivers for working with local file systems, Amazon S3, and Rackspace Cloud Storage.

Determining If A File Exists

Calling Methods On The Default Disk

Retrieving A File's Contents

Setting A File's Contents

Prepend To A File

Append To A File

Delete A File

Copy A File To A New Location

Move A File To A New Location

Get File Size

Get The Last Modification Time (UNIX)

Get All Files Within A Directory

Get All Directories Within A Directory

Create A Directory

Delete A Directory

Similarly, the user registrar service that ships with Laravel makes the proper bcrypt function call to hash stored passwords.

Hashing

Hashing A Password Using Bcrypt

Verifying A Password Against A Hash

Checking If A Password Needs To Be Rehashed

The array_add function adds a given key/value pair to the array if the given key does not already exist in the array. The array_divide function returns two arrays, one containing the keys and the other containing the values ​​of the original array.

Helper Functions

Arrays

The array_first method returns the first array element that passes the given truth test. The array_last method returns the last array element that passes the given truth test.

The array_forget method removes a given key/value pair from a deeply nested array using the "dot" notation.

The array_get method will retrieve a given value from a deeply nested array using "dot" notation. The array_pluck method will pluck a list of the given key/value pairs from the array.

The array_only method will return only the specified key/value pairs from the array. The array_pull method will return the given key/value pair from the array and also remove it.

Paths

Strings

URLs

Miscellaneous

The default language for your application is stored in the configuration file config/app.php. Like the default language, the fallback language is also configured in the configuration file config/app.php:.

Localization

Language Files

Changing The Default Language At Runtime

Setting The Fallback Language

Note: If a language line does not exist, the key will be returned by the get method. You can also use the trans helper function, which is an alias for the Lang::get method.

Retrieving Lines From A Language File

The first segment of the string passed to the get method is the name of the language file, and the second is the name of the line to retrieve.

Making Replacements In Lines

Determine If A Language File Contains A Line

Pluralization

So, for example, if you need to override the English language lines in messages.php for a package named skyrim/hearthfire, you would place a language file at: resources/lang/packages/en/hearthfire/messages.php. Any language rules you don't override will still be loaded from the package's language files.

Validation

Instead of hacking the main package files to fix these lines, you can override them by placing files in the sources/lang/packages/{locale}/{package} directory.

Overriding Package Language Files

Mail

API Drivers

Mailgun Driver

Mandrill Driver

Log Driver

The first argument passed to the send method is the name of the view to use as the body of the email. Note: A variable $message is always passed to email views and allows inline embedding of attachments.

Embedding Inline Attachments

Note that the $message variable is always passed to email views from the mail side. To do this, you can call the Mail::pretend method or set the pretend to option.

Embedding An Image In An E-Mail View

If you want to specify a specific queue or "pipe" on which to push the message, you can do so using queueOn and. When developing an application that sends e-mail, it is usually desirable to disable the sending of messages from your local or development environment.

Embedding Raw Data In An E-Mail View

Since sending e-mail messages can drastically increase the response time of your application, many developers choose to queue e-mail messages for sending in the background. If you want to view test emails, consider using a service like MailTrap.

Queueing Mail

Queueing A Mail Message

Mail & Local Development

All Laravel packages are distributed through Packagist and Composer, so getting to know these wonderful PHP package distribution tools is a must. When you use the loadViewsFrom method, Laravel actually registers two locations for your views: one in the application.

Package Development

To publish your package's views to the resources/views/vendor directory, use the publish method from. Typically, you'll want to publish your package's configuration file to the program's own configuration folder.

Publishing Views

Now when users of your package run Laravel's vendor:publish command, your views folder will be copied to the specified location. To publish a configuration file, simply use the publish method from your service provider's startup method:.

Translations

Now, when users of your package execute Laravel's vendor:publish command, your file will be copied to the specified location. For example, you might want your users to be able to publish your package's configuration files and resource files separately.

Publishing File Groups

You can also choose to bundle your own package configuration file with the application's copy. Note: If your package uses controllers, you'll need to make sure they're properly in yours.

Routing

This allows your users to include only the options they actually want to override in the published copy of the configuration. To load a route file into your package, simply include it from your service provider's startup method.

Including A Routes File From A Service Provider

Sometimes you may want to manually create a pagination instance and pass an array of items. You can do this by creating an Illuminate\Pagination\Paginator or Illuminate\Pagination\LengthAwarePaginator instance, depending on your needs.

Paginating Database Results

The simplest is by using the pagination method in the Eloquent query builder or model. The argument passed to the paginate method is the number of elements to display per page.

Creating A Paginator Manually

If you need to use groupBy with a paginated result set, it is recommended that you query the database and manually create the paginator.

Paginating An Eloquent Model

The example above will create URLs like the following: http://example.com/custom/url?page=2. The JSON'd form of the instance will include some "meta" information such as total , current_page , and last_page .

34;Simple Pagination"

Customizing The Paginator URI

Appending To Pagination Links

Converting To JSON

In this file you will find the connection configurations for each of the queue managers that are included with the framework, which includes a database, Beanstalkd, IronMQ, Amazon SQS, Redis, null, and synchronous (for local use) drivers. All queued jobs for your application are stored in the App\Commands directory.

Queues

Queues allow you to delay the processing of a time-consuming task, such as sending an email, to a later time, dramatically speeding up web requests for your application. To use a database queue driver, you will need a database table to store jobs.

Queue Database Table

Other Queue Dependencies

Pushing A Job Onto The Queue

Note: In this example, we use the queue facade directly; however, you typically send a queued command via the command bus. When the job is actually done, the queue system will automatically re-fetch the entire model instance from the database.

Specifying The Queue / Tube For A Job

We will continue to use the queue facade on this page; However, also be sure to familiarize yourself with the command bus, as it is used to send both queued and synchronous commands for your application. If your queued job accepts an Eloquent model in the constructor, only the identifier for the model is queued.

Passing The Same Payload To Multiple Jobs

For example, you might want to queue a job that sends a customer an email 15 minutes after signing up. Alternatively, you can pass the number of seconds you want to delay as an integer.

Delaying The Execution Of A Job

The generated handler will be placed in App\Handlers\Commands and will be resolved outside the IoC container. In this example, we are using the carbon date library to specify the delay we want to assign to the job.

Queues And Eloquent Models

If an exception is thrown while processing the job, it will automatically be released back into the queue, so it can be retried. If an exception occurs while the job is being processed, it will automatically be released back into the queue.

Deleting A Processed Job

If you want to delete or release the job manually, the Illuminate\Queue\InteractsWithQueue property provides access to the release and delete methods of the queue job. The maximum number of attempts is determined by the --tries switch used in queue:listen or.

Releasing A Job Back Onto The Queue

The release method accepts a single value: the number of seconds you want to wait for the task to become available again. The transaction will continue to be released until it has been retried as many times as your application allows.

Checking The Number Of Run Attempts

Note: Your command/handler must use the Illuminate\Queue\InteractsWithQueue property to call this method. The endpoint that receives your queued messages must verify the token to verify that the request is actually from Iron.io.

Queueing Closures

If no exception occurs during the execution of your task, it will happen automatically. Note: Instead of making objects available for queue closures via the usage statement, consider passing primary keys and retrieving the associated models from your queue job.

Pushing A Closure Onto The Queue

Laravel includes a Craft task that will spawn new jobs as they are pushed to the queue. You can use a process monitor such as Supervisor to ensure that the queue listener does not stop running.

Running The Queue Listener

Note that once this task is started, it will continue to run until it is stopped manually. Queue:work also includes a --daemon option to force the queue worker to continue processing jobs without ever repeating.

Starting The Queue Listener

In this example, jobs on the high connection will always be processed before moving to jobs from the low connection.

Specifying The Job Timeout Parameter

Specifying Queue Sleep Duration

Processing The First Job On The Queue

Daemon Queue Worker

As you can see, the queue:work command supports most of the same options available to queue:listen. Then create a route for your queue/receive endpoint and return the response from the Queue::marshal method:.

Deploying With Daemon Queue Workers

This results in a significant reduction in CPU usage compared to the queue:listen command, but with the added complexity of clearing the queues of currently running tasks during your deployments. Before you get started, create an Iron.io account and add your Iron credentials to the config/queue.php configuration file.

Coding For Daemon Queue Workers

The simplest way to deploy an application using daemon queue workers is to put the application in maintenance mode at the beginning of your deployment. This command will instruct all queue workers to restart when they have finished processing their current job.

Push Queues

Once the application is in maintenance mode, Laravel will not accept new out-of-queue tasks, but will continue to process existing tasks. For example, if you perform image manipulation with the GD library, you will need to free the memory with imagedestroy when you are done.

Registering A Push Queue Subscriber

You can specify the maximum number of times a job should be attempted by using the --tries button on the queue:list. If you would like to register an event that will be called when a queue job fails, you can use the Queue::failing method.

Failed Jobs

To enable jobs on the push queue, simply use the same Queue::push method used for conventional queues. Laravel includes a convenient way to specify the maximum number of times a job should be attempted.

Retrying Failed Jobs

The name of the failed tasks table can be configured through the configuration file config/queue.php. By default, Laravel is configured to use the file session driver, which will work fine for most users.

Reserved Keys

Session Usage

Storing An Item In The Session

Push A Value Onto An Array Session Value

Retrieving An Item From The Session

Retrieving An Item And Forgetting It

Sometimes you may want to save items in the session just for the next request. When using the database session driver, you will need to set up a table to contain the session items.

Retrieving All Data From The Session

Determining If An Item Exists In The Session

Removing An Item From The Session

Removing All Items From The Session

Regenerating The Session ID

Flash Data

Reflashing The Current Flash Data For Another Request

Reflashing Only A Subset Of Flash Data

Database Sessions

Of course, you can use the session:table Artisan command to generate this migration for you. Note: The cluster driver is typically used for running unit tests, so no session data will be persisted.

Session Drivers

The content of the layout can be included in a child view using the @parent directive in a section, so you can add to the content of a layout section, such as a sidebar or footer. Sometimes, like when you're not sure if a section has been defined, you might want to pass a default value to.

Templates

Blade Templating

Defining A Blade Layout

Using A Blade Layout

Other Blade Control Structures

Echoing Data

Sometimes you might want to echo a variable, but you're not sure if the variable has been set. Always use the double curly brace syntax to escape any HTML entities in the content.

Echoing Data After Checking For Existence

Note: Be very careful when echoing content submitted by users of your app.

Displaying Raw Text With Curly Braces

If Statements

Loops

When a Blade file is compiled, each custom extension is called with the display content, allowing you to do everything from simple str_replace manipulations to more complex regular expressions. The Blade compiler comes with the createMatcher and createPlainMatcher helper methods, which generate the expression you need to build your own custom directives.

Including Sub-Views

The createPlainMatcher method is used for directives without arguments, such as @endif and @stop, while createMatcher is used for directives with arguments.

Overwriting Sections

Displaying Language Lines

Comments

Extending Blade

You can run all the tests for your application by running the phpunit command in the terminal. Both drivers are set to string in the test environment, which means that no session or cache data will be preserved during testing.

Testing

Defining & Running Tests

An Example Test Class

Test Environment

Calling Routes From Tests

Calling A Route From A Test

Note: You do not need to specify the full controller namespace when using the action method. We can mock the call to the Event class by using the ShouldReceive method on the facade, which returns an instance of a Mockery mock.

Calling A Controller From A Test

Specify only the part of the class name that follows the App\Http\Controllers namespace.

Mocking A Facade

Framework Assertions

Asserting Responses Are OK

Asserting Response Statuses

Asserting Responses Are Redirects

Asserting A View Has Some Data

Asserting The Session Has Some Data

Asserting The Session Has Errors

As you may already know, you can access your Laravel app / IoC container via $this->app from any test method. If you want to manually force the application to refresh for a given method, you can use the refreshApplication method from your test method.

Asserting Old Input Has Some Data

More information on creating seeds can be found in the migrations and seeding section of the documentation. This will reset any additional bindings, such as mocks, that have been placed on the IoC container since the test case was run.

Helper Methods

Setting And Flushing Sessions From Tests

Setting The Currently Authenticated User

Re-Seeding Database From Tests

Refreshing The Application

Laravel provides a simple and convenient facility for validating data and getting validation error messages via. Once a Validator instance has been created, the fail (or pass ) method can be used to perform validation.

Basic Validation Example

Multiple lines can be delimited using a "pipe" character, or as individual elements of an array.

Using Arrays To Specify Rules

Validating Multiple Fields

The evaluator also allows you to attach callbacks to be executed after validation completes. This allows you to easily perform further verifications and even add more error messages to the message collection.

Validating Files

The Validator class provides several rules for validating files, such as size , mimes and others. When validating files, you can easily pass them along with your other data to the validator.

After Validation Hook

Of course, creating and checking a Validator instance every time you do validation is a headache.

Controller Validation

Instead, an HTTP response with status code 422 will be returned to the browser, containing a JSON representation of the validation errors. Override to customize the format of validation errors that appear in a session when validation fails.

Customizing The Flashed Error Format

Errors will also be displayed in the session so they will be available for viewing. If the request was an AJAX request, an HTTP response with status code 422 will be returned to the user, including a JSON representation of the validation errors.

Authorizing Form Requests

Inside this method you can check if the authenticated user actually has the authority to update the given resource. If the authorization method returns false, an HTTP response with a 403 status code will automatically be returned and your controller method will not execute.

Working With Error Messages

Retrieving The First Error Message For A Field

Retrieving All Error Messages For A Field

Retrieving All Error Messages For All Fields

Determining If Messages Exist For A Field

Retrieving An Error Message With A Format

This method will flash the error messages to the session so that they are available on the next request. Note, however, that we don't need to explicitly bind the error messages to the representation in our GET route.

Retrieving All Error Messages With A Format

This is because Laravel will always check for errors in the session data and automatically bind them to the view if available. So it's important to note that a $errors variable will always be available in all of your views, on every request, allowing you to conveniently assume that the $errors variable is always defined and can be used safely.

Error Messages & Views

Once you've done validation, use an easy way to get the error messages back into your views. Note that when validation fails, we pass the Validator instance to Redirect using the withErrors method.

Named Error Bags

If you have multiple forms on one page, you may want to name the MessageBag with errors.

Available Validation Rules

The field under validation must match the format defined by the date_parse_from_format PHP function. The field under validation must be numeric and must have an exact length of value.

The field being validated can contain alphanumeric characters as well as dashes and underscores.

The file under validation must have a MIME type that matches one of the listed extensions.

Basic Usage Of Exists Rule

Specifying A Custom Column Name

Basic Usage Of MIME Rule

The field under validation must be present only if any of the other specified fields are present. The field under validation must be present only if all other specified fields are present.

The field being checked must be present if the field is equal to any value. The field being checked must be present only if one of the other specified fields is not present.

Note: When using the regex pattern, it may be necessary to specify the rules in an array instead of using pipe delimiters, especially if the regular expression contains a pipe character. The field under validation must be present only when all other specified fields are not present.

The field under validation must be a valid timezone identifier according to the PHP timezone_identifiers_list function. In some situations, you may want to perform validation checks against a field only if that field is present in the input set.

In the rule above, only rows with an Account ID of 1 will be included in the unique check. In the example above, the email field will only be validated if it is present in the $data array.

Sometimes you may want to search for a particular field only if another field has a value greater than 100. Or you may need two fields to have a particular value only when another field is present.

Basic Usage Of Unique Rule

Adding Additional Where Clauses

Conditionally Adding Rules

Complex Conditional Validation

The first argument passed to the sometimes method is the name of the field we are conditionally validating. Note: the :attribute placeholder will be replaced by the actual name of the field during validation.

Custom Error Messages

If the closure passed as the third argument returns true , the rules will be added. Note: The $input parameter passed to your closure will be an instance of Illuminate\Support\Fluent and can be used as an object to access your inputs and files.

Passing Custom Messages Into Validator

If a game collector registers with our app and they own more than 100 games, we want them to explain why they own so many games. To add this requirement conditionally, we can use the sometimes method on the Validator instance.

Other Validation Place-Holders

In some cases, you may want to specify your custom messages in a language file instead of passing them directly to the file. Laravel provides a number of useful validation rules; however, you may want to specify some of your own.

Specifying A Custom Message For A Given Attribute

The Closure custom evaluator takes three arguments: the name of the $attribute being validated, the $value of the attribute, and an array of $parameters that are passed to the rule. Instead of using closure calls to extend Validator, you can also extend the Validator class itself.

Specifying Custom Messages In Language Files

To do this, add your messages to the custom array in the language file resources/lang/xx/validation.php. You can do this using an inline custom message array or by adding an entry to the validation language file.

Custom Validation Rules

Note that you must also define an error message for your custom rules.

Registering A Custom Validation Rule

Extending The Validator Class

When creating a custom validation rule, you may sometimes need to specify custom placeholders for error messages. You can do this by creating a custom validator as described above and adding the replaceXXX function to the validator.

Registering A Custom Validator Resolver

If you want to add a custom message "replacement" without extending the Validator class, you can use the .

Database

The rest of the database options for read and write connections will be merged from the main mysql group. The database credentials, prefix, charset, and all other options in the mysql key set will be shared across both connections.

Basic Database Usage

Read / Write Connections

Running Queries

Running A Select Query

Note: Any exception thrown within the closing of the transaction will cause the transaction to be automatically rolled back.

Running An Insert Statement

Running An Update Statement

R

Referensi

Dokumen terkait

In addition to looking at the development of tax revenues, non-tax state revenues, and the contribution of tax revenues and non-tax state revenues to the