换种方式使用 Laravel 的 request 验证

发布时间:2021-07-24 08:05:38 阅读:1366次

https://learnku.com/articles/40360

之前在公司一直拿着 laravel 这个全栈框架当做 api 框架使用,为什么不用 lumen,可能是任性吧。长期使用中对 laravel 进行了大量的二次改写 ,这里分享一下另外一种 request 的验证使用,让 request 的使用更加适用于前后端分离 json 交互的后端项目,分享给社区的朋友。

请指点。

laravel 的 request 验证都是交给异常去处理的,所以这里我新建了一个处理 except 的类

 php artisan make:exception ApiRequestExcept
ApiRequestExcept.php 代码如下


<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Http\Request;

class ApiRequestExcept extends Exception
{
      /**
      * @var int http status code
      */ 
      protected $statusCode;

      public function __construct($message = "", $code = 0, $statusCode = 500)
      { 
          $this->statusCode = $statusCode;
          parent::__construct($message, $code);
      }

      public function render(Request $request)
      {
          return response([
              'code' => $this->code,
              'msg' => $this->message
          ])->setStatusCode($this->statusCode);
     }
}
然后我们在新建一个 request,并且改写

 php artisan make:request ApiBaseRequest
ApiBaseRequest.php 代码如下


<?php

namespace App\Http\Requests;

use App\Exceptions\ApiRequestExcept;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;

class ApiBaseRequest extends FormRequest
{
      /**
     * 程序自定义业务错误码
      *
     * @var int
      */
      protected $code = 0;

      /**
     * http状态码
      *
     * @var int
      */
      protected $statusCode = 500;

      /**
     * Determine if the user is authorized to make this request. * * @return bool
      */
      public function authorize()
      {  
           return true;
      }

      /**
     * @param Validator $validator
      *
     * @throws ApiRequestExcept
      */
      protected function failedValidation(Validator $validator)
      {  
           throw new ApiRequestExcept(
               $validator->errors()->first(),
               $this->code,
               $this->statusCode
            );
      }
}
这个 request 是需要其他 request 继承的基类,现在我们试试效果。

我们新建一个 UserRequest, 然后继承 ApiBaseRequest 这个文件

php artisan make:request UserRequest

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends ApiBaseRequest
{
      public function rules()
      {  
         return [
              'name' => 'required'
          ];
      }

      public function messages()
      {  
         return [
              'name.required' => '请先填写名字'
          ];
      }
 }
然后在控制器中使用这个 UserRequest


<?php

namespace App\Http\Controllers;

use App\Http\Requests\UserRequest;

class RequestController extends Controller
{

    public function user(UserRequest $request)
    {  
        return [
          'code' => 200,
          'msg' => '通过测试',
          'name' => $request->name
        ];
     }

 }
在没有填写 name 字段的时候,就会有这个响应



现在把 name 字段加入,就正常通过了



然后自定义的 code 和 http 的 statuscode 是直接在 UserRequest 中写就可以的,非常方便


<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends ApiBaseRequest
{

      protected $code = -1;

      protected $statusCode = 400;

      public function rules()
      {  
         return [
              'name' => 'required'
          ];
      }

      public function messages()
      {  
         return [
              'name.required' => '请先填写名字'
          ];
      }
 }
然后把 name 字段取消再试一次



可以看到业务码和 http 的 statuscode 都变了。

如果每次都去修改新建的 request 代码有点麻烦,那么简单的做法就是我们重写一下 artisan make 的命令

php artisan make:command RequestMakeCommand
把 RequestMakeCommand 文件改成如下


<?php

namespace App\Console\Commands;

//use Illuminate\Console\Command;
use Illuminate\Foundation\Console\RequestMakeCommand as Command;

class RequestMakeCommand extends Command
{

      protected function getStub()
      {  
           return __DIR__.'/stubs/request.stub';
      }

 }
这个 request.stub 是自己建的,文件结构如下图



这是 request.stub 的内容,如下


<?php

namespace DummyNamespace;

class DummyClass extends ApiBaseRequest
{
    public function rules()
    {
        return [

        ];
    }

    public function messages()
    {
        return [

        ];
    }
}
现在就可以了,让我们再试一试


 php artisan make:request EditRequest
我们会发现通过命令你行建的 request 文件符合改造,如下


<?php

namespace App\Http\Requests;

class EditRequest extends ApiBaseRequest
{

     public function rules()
     {  
          return [
              'age' => 'numeric'
          ]; 
      }

      public function messages()
      {  
           return [
               'age.numeric' => '年龄必须是数字'
           ];
      }

}
rules 方法和 message 方法里面的代码是我自己添加上去的,然后测试一下。



好了,搞定。

如此改造了之后的 request 让我们开发更加愉悦了,而且改动的也很轻量,让后端使用起来更加得心应手。如果有帮助到正在看的你,请点个赞。如果你有更好的看法,请指点。技术多交流,社区和大家才会变的越来越棒。

最后,武汉加油!!!
疫情结束后,我还要回成都找工作。

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:换种方式使用 Laravel 的 request 验证 出自老鄢博客 | 欢迎分享