Last active
March 2, 2022 07:38
-
-
Save mikimaine/5733f3729f57ec981e0dc30917639cf0 to your computer and use it in GitHub Desktop.
Request class for Lumen
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Requests; | |
use Illuminate\Http\Request; | |
use Illuminate\Http\Response; | |
use Illuminate\Http\JsonResponse; | |
use Laravel\Lumen\Http\Redirector; | |
use Illuminate\Container\Container; | |
use Illuminate\Contracts\Validation\Validator; | |
use Illuminate\Validation\UnauthorizedException; | |
use Illuminate\Http\Exceptions\HttpResponseException; | |
use Illuminate\Validation\ValidatesWhenResolvedTrait; | |
use Illuminate\Contracts\Validation\ValidatesWhenResolved; | |
use Illuminate\Contracts\Validation\Factory as ValidationFactory; | |
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
class Request extends Request implements ValidatesWhenResolved | |
{ | |
use ValidatesWhenResolvedTrait; | |
/** | |
* The container instance. | |
* | |
* @var \Illuminate\Container\Container | |
*/ | |
protected $container; | |
/** | |
* The redirector instance. | |
* | |
* @var \Laravel\Lumen\Http\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'; | |
/** | |
* The input keys that should not be flashed on redirect. | |
* | |
* @var array | |
*/ | |
protected $dontFlash = ['password', 'password_confirmation']; | |
/** | |
* Get the validator instance for the request. | |
* | |
* @return \Illuminate\Contracts\Validation\Validator | |
*/ | |
protected function getValidatorInstance() | |
{ | |
$factory = $this->container->make(ValidationFactory::class); | |
if (method_exists($this, 'validator')) { | |
return $this->container->call([$this, 'validator'], compact('factory')); | |
} | |
return $factory->make( | |
$this->validationData(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes() | |
); | |
} | |
/** | |
* Get data to be validated from the request. | |
* | |
* @return array | |
*/ | |
protected function validationData() | |
{ | |
return $this->all(); | |
} | |
/** | |
* Handle a failed validation attempt. | |
* | |
* @param \Illuminate\Contracts\Validation\Validator $validator | |
* @return void | |
* | |
* @throws \Illuminate\Http\Exceptions\HttpResponseException | |
*/ | |
protected function failedValidation(Validator $validator) | |
{ | |
throw new HttpResponseException($this->response( | |
$this->formatErrors($validator) | |
)); | |
} | |
/** | |
* Determine if the request passes the authorization check. | |
* | |
* @return bool | |
*/ | |
protected function passesAuthorization() | |
{ | |
if (method_exists($this, 'authorize')) { | |
return $this->container->call([$this, 'authorize']); | |
} | |
return false; | |
} | |
/** | |
* Handle a failed authorization attempt. | |
* | |
* @return void | |
* | |
* @throws \Illuminate\Http\Exceptions\HttpResponseException | |
*/ | |
protected function failedAuthorization() | |
{ | |
// throw new HttpResponseException($this->forbiddenResponse()); | |
throw new UnauthorizedException($this->forbiddenResponse()); | |
} | |
/** | |
* Get the proper failed validation response for the request. | |
* | |
* @param array $errors | |
* @return \Symfony\Component\HttpFoundation\Response | |
*/ | |
public function response(array $errors) | |
{ | |
if (($this->ajax() && ! $this->pjax()) || $this->wantsJson()) { | |
return new JsonResponse($errors, 422); | |
} | |
return $this->redirector->to($this->getRedirectUrl()) | |
->withInput($this->except($this->dontFlash)) | |
->withErrors($errors, $this->errorBag); | |
} | |
/** | |
* Get the response for a forbidden operation. | |
* | |
* @return \Illuminate\Http\Response | |
*/ | |
public function forbiddenResponse() | |
{ | |
return new Response('Forbidden', 403); | |
} | |
/** | |
* Format the errors from the given Validator instance. | |
* | |
* @param \Illuminate\Contracts\Validation\Validator $validator | |
* @return array | |
*/ | |
protected function formatErrors(Validator $validator) | |
{ | |
return $validator->getMessageBag()->toArray(); | |
} | |
/** | |
* 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(); | |
} | |
/** | |
* Set the Redirector instance. | |
* | |
* @param \Laravel\Lumen\Http\Redirector $redirector | |
* @return $this | |
*/ | |
public function setRedirector(Redirector $redirector) | |
{ | |
$this->redirector = $redirector; | |
return $this; | |
} | |
/** | |
* Set the container implementation. | |
* | |
* @param \Illuminate\Container\Container $container | |
* @return $this | |
*/ | |
public function setContainer(Container $container) | |
{ | |
$this->container = $container; | |
return $this; | |
} | |
/** | |
* Get custom messages for validator errors. | |
* | |
* @return array | |
*/ | |
public function messages() | |
{ | |
return []; | |
} | |
/** | |
* Get custom attributes for validator errors. | |
* | |
* @return array | |
*/ | |
public function attributes() | |
{ | |
return []; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment