在做表单验证的时候,如果验证的规则过多,控制器会很冗长,看着很烦心。lumen默认是不支持表单请求验证的,为此需要做一些修改。
第一步:复制FormRequest类中的内容,修改自己想要的错误返回格式
<?php
namespace App\Http\Requests;
use Illuminate\Http\Request as IlluminateRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Container\Container;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exception\HttpResponseException;
use Illuminate\Validation\ValidatesWhenResolvedTrait;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
abstract class Request extends IlluminateRequest implements ValidatesWhenResolved
{
use ValidatesWhenResolvedTrait;
/**
* The container instance.
*
* @var \Illuminate\Container\Container
*/
protected $container;
/**
* 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\Exception\HttpResponseException
*/
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException($this->response(
$this->formatErrors($validator)
));
}
/**
* Get the proper failed validation response for the request.
*
* @param array $errors
* @return \Symfony\Component\HttpFoundation\Response
*/
public function response(array $errors)
{
return new JsonResponse($errors, 200);
}
/**
* Format the errors from the given Validator instance.
*
* @param \Illuminate\Contracts\Validation\Validator $validator
* @return array
*/
protected function formatErrors(Validator $validator)
{
return ['code' => 500, 'msg' => $validator->messages()->first()];
}
/**
* 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
*/
abstract public function messages();
abstract public function rules();
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [];
}
}
第二步:创建一个服务提供者RequestServiceProvider,像laravel中的FoundationServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Http\Requests\Request as FormRequest;
use Symfony\Component\HttpFoundation\Request;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
class RequestServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->configureFormRequests();
}
protected function configureFormRequests()
{
$this->app->afterResolving(function (ValidatesWhenResolved $resolved) {
$resolved->validate();
});
$this->app->resolving(function (FormRequest $request, $app) {
$this->initializeRequest($request, $app['request']);
});
}
/**
* Initialize the form request with data from the given request.
*
* @param \App\Http\Requests\FormRequest $form
* @param \Symfony\Component\HttpFoundation\Request $current
* @return void
*/
protected function initializeRequest(FormRequest $form, Request $current)
{
$files = $current->files->all();
$files = is_array($files) ? array_filter($files) : $files;
$form->initialize(
$current->query->all(), $current->request->all(), $current->attributes->all(),
$current->cookies->all(), $files, $current->server->all(), $current->getContent()
);
$form->setContainer($this->app);
}
}
第三步:在bootstrap/app.php中注册刚刚创建的服务
$app->register(App\Providers\RequestServiceProvider::class);
第四步:然后就可以使用了
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class Test extends Request
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
public function messages()
{
return [
'title.required' => '标题不能为空',
'body.required' => '主体不能为空',
];
}
}
本文转自 https://blog.csdn.net/qq_29302319/article/details/81327031