FormRequest.php
TLDR
The FormRequest.php
file is a class that extends the Request
class in the Illuminate\Foundation\Http
namespace. It provides functionality for form validation and handling validation failures in Laravel applications.
Methods
getValidatorInstance
This method returns the validator instance for the request. It first checks if a validator instance has already been created and returns it if available. Otherwise, it uses the container to create a new validator instance using the ValidationFactory
class. If a validator
method exists in the class, it calls that method to obtain the validator instance. Otherwise, it uses the createDefaultValidator
method to create the default validator instance. Finally, it calls the withValidator
and after
methods if they exist, and sets the validator instance as a property of the class before returning it.
createDefaultValidator
This method creates and returns the default validator instance for the request. It first checks if a rules
method exists in the class and calls it using the container to obtain the validation rules. It then uses the ValidationFactory
instance to create the validator using the validation data, rules, messages, and attributes. It also sets the stopOnFirstFailure
attribute of the validator based on the value of the corresponding attribute in the request. If the request is "precognitive", it updates the rules of the validator using the setRules
method. Finally, it returns the validator instance.
validationData
This method returns data to be validated from the request. It simply calls the all
method of the request class, which returns all input data.
failedValidation
This method handles a failed validation attempt by throwing a ValidationException
with the validator's exception. It sets the error bag and redirect information before throwing the exception.
getRedirectUrl
This method gets the URL to redirect to on a validation error. It uses the Redirector
instance to generate the redirect URL based on the redirect
, redirectRoute
, and redirectAction
properties of the request. If none of those properties are set, it returns the URL of the previous page.
passesAuthorization
This method determines if the request passes the authorization check. If the class has an authorize
method, it calls it using the container and returns the result. If the result is an instance of the Response
class, it calls the authorize
method of that instance. Otherwise, it returns the result.
failedAuthorization
This method handles a failed authorization attempt by throwing an AuthorizationException
.
safe
This method returns a validated input container for the validated input. If an array of keys is provided, it returns the subset of validated input that corresponds to those keys. Otherwise, it returns the entire validated input.
validated
This method returns a specific key's value from the validated data. If the key is not found, it returns the default value.
messages
This method returns custom messages for validator errors. It should be overridden in subclasses to return specific messages.
attributes
This method returns custom attributes for validator errors. It should be overridden in subclasses to return specific attributes.
setValidator
This method sets the Validator instance for the request.
setRedirector
This method sets the Redirector instance for the request.
setContainer
This method sets the container implementation for the request.
<?php
namespace Illuminate\Foundation\Http;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\Access\Response;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Validation\ValidatesWhenResolvedTrait;
class FormRequest extends Request implements ValidatesWhenResolved
{
use ValidatesWhenResolvedTrait;
/**
* The container instance.
*
* @var \Illuminate\Contracts\Container\Container
*/
protected $container;
/**
* The redirector instance.
*
* @var \Illuminate\Routing\Redirector
*/
protected $redirector;
/**
* The URI to redirect to if validation fails.
*
* @var string
*/
protected $redirect;
/**
* The route to redirect to if validation fails.
*
* @var string
*/
protected $redirectRoute;
/**
* The controller action to redirect to if validation fails.
*
* @var string
*/
protected $redirectAction;
/**
* The key to be used for the view error bag.
*
* @var string
*/
protected $errorBag = 'default';
/**
* Indicates whether validation should stop after the first rule failure.
*
* @var bool
*/
protected $stopOnFirstFailure = false;
/**
* The validator instance.
*
* @var \Illuminate\Contracts\Validation\Validator
*/
protected $validator;
/**
* Get the validator instance for the request.
*
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function getValidatorInstance()
{
if ($this->validator) {
return $this->validator;
}
$factory = $this->container->make(ValidationFactory::class);
if (method_exists($this, 'validator')) {
$validator = $this->container->call([$this, 'validator'], compact('factory'));
} else {
$validator = $this->createDefaultValidator($factory);
}
if (method_exists($this, 'withValidator')) {
$this->withValidator($validator);
}
if (method_exists($this, 'after')) {
$validator->after($this->container->call(
$this->after(...),
['validator' => $validator]
));
}
$this->setValidator($validator);
return $this->validator;
}
/**
* Create the default validator instance.
*
* @param \Illuminate\Contracts\Validation\Factory $factory
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function createDefaultValidator(ValidationFactory $factory)
{
$rules = method_exists($this, 'rules') ? $this->container->call([$this, 'rules']) : [];
$validator = $factory->make(
$this->validationData(), $rules,
$this->messages(), $this->attributes()
)->stopOnFirstFailure($this->stopOnFirstFailure);
if ($this->isPrecognitive()) {
$validator->setRules(
$this->filterPrecognitiveRules($validator->getRulesWithoutPlaceholders())
);
}
return $validator;
}
/**
* Get data to be validated from the request.
*
* @return array
*/
public function validationData()
{
return $this->all();
}
/**
* Handle a failed validation attempt.
*
* @param \Illuminate\Contracts\Validation\Validator $validator
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
protected function failedValidation(Validator $validator)
{
$exception = $validator->getException();
throw (new $exception($validator))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());
}
/**
* Get the URL to redirect to on a validation error.
*
* @return string
*/
protected function getRedirectUrl()
{
$url = $this->redirector->getUrlGenerator();
if ($this->redirect) {
return $url->to($this->redirect);
} elseif ($this->redirectRoute) {
return $url->route($this->redirectRoute);
} elseif ($this->redirectAction) {
return $url->action($this->redirectAction);
}
return $url->previous();
}
/**
* Determine if the request passes the authorization check.
*
* @return bool
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
protected function passesAuthorization()
{
if (method_exists($this, 'authorize')) {
$result = $this->container->call([$this, 'authorize']);
return $result instanceof Response ? $result->authorize() : $result;
}
return true;
}
/**
* Handle a failed authorization attempt.
*
* @return void
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
protected function failedAuthorization()
{
throw new AuthorizationException;
}
/**
* Get a validated input container for the validated input.
*
* @param array|null $keys
* @return \Illuminate\Support\ValidatedInput|array
*/
public function safe(array $keys = null)
{
return is_array($keys)
? $this->validator->safe()->only($keys)
: $this->validator->safe();
}
/**
* Get the validated data from the request.
*
* @param array|int|string|null $key
* @param mixed $default
* @return mixed
*/
public function validated($key = null, $default = null)
{
return data_get($this->validator->validated(), $key, $default);
}
/**
* Get custom messages for validator errors.
*
* @return array
*/
public function messages()
{
return [];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [];
}
/**
* Set the Validator instance.
*
* @param \Illuminate\Contracts\Validation\Validator $validator
* @return $this
*/
public function setValidator(Validator $validator)
{
$this->validator = $validator;
return $this;
}
/**
* Set the Redirector instance.
*
* @param \Illuminate\Routing\Redirector $redirector
* @return $this
*/
public function setRedirector(Redirector $redirector)
{
$this->redirector = $redirector;
return $this;
}
/**
* Set the container implementation.
*
* @param \Illuminate\Contracts\Container\Container $container
* @return $this
*/
public function setContainer(Container $container)
{
$this->container = $container;
return $this;
}
}