您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

解析如何进行Laravel表单验证分层设计和验证场景应用

2024/3/1 21:03:20发布22次查看
思考我发现大多数的laravel用户会将验证规则写在controller下,但这会有一个问题,使代码杂乱且无法复用相同的规则。在crud为主的项目中,我们会发现好多字段以及它们的验证规则是相同的,我们一般会化身为cv工程师,再复制一份,那么为什么不加一层验证层?
伴随这个问题,然后去看了别的开源项目的代码,发现tp用户的验证会放在一个单独的类中,并且有验证场景来支持他们复用规则,于是我寻找laravel中有没有对应的解决方案,然后发现了微擎的一个验证器w7/engine-validate,接下里的文章就依赖此扩展来讲如何增加一个验证层
安装composer require w7/engine-validate
介绍首先此验证器也是基于illuminate/validation的,关于它的详细说明可以直接查看它的文档,这里就不过多说明了。
使用首先我们建立一个和控制器相对应的验证层
app├── http│   ├── controllers│   │   └── usercontroller.php│   └── validate│       └── uservalidate.php
验证器验证器代码:
class uservalidate extends validate{    protected $rule = [        'user' => 'required|email',        'pass' => 'required|alpha_num'    ];    protected $message = [        'user.required' => '账号不可为空',        'pass.required' => '密码不可为空',    ];    protected $customattributes = [       'user' => '账号',       'pass' => '密码',    ];}
控制器代码:
class usercontroller extends basecontroller{    use authorizesrequests, dispatchesjobs, validatesrequests;    public function login(request $request)    {        $data = uservalidate::make()->check($request->all());    }}
这个时候,如果值不符合要求,会抛出一个validateexception异常,我们可以选择手动捕获,也可以选择在异常捕获类里面做一个全局的处理:
    public function render($request, throwable $e)    {        if ($e instanceof validateexception) {            return response()->json([                'code'    => -1,                'message' => $e->getmessage()            ]);        }        return parent::render($request, $e);    }
这样我们就不需要再控制器里面管理任何的验证异常了。
此时,控制器中的$data一定是符合我们需求的数据,然后可以紧接着做对应的业务处理
验证场景这个时候,如果我们的usercontroller控制器中又添加了一个register方法,在以上两个字段的需求同时增加了name,应该如何处理呢?
我们可以使用类的$scene属性来指定某一场景下需要验证的字段
验证器代码修改如下:
class uservalidate extends validate{    protected $rule = [        'user' => 'required|email',        'pass' => 'required|alpha_num',        'name' => 'required|alpha'    ];    protected $message = [        'user.required' => '账号不可为空',        'pass.required' => '密码不可为空',    ];    protected $customattributes = [       'user' => '账号',       'pass' => '密码',       'name' => '用户名称',    ];    protected $scene = [       'login'    => ['user', 'pass'],       'register' => ['user', 'pass', 'name']    ];}
此时:login场景对应的验证user和pass字段,而register场景对应的验证user,pass,name字段
控制器代码修改如下:
class usercontroller extends basecontroller{    use authorizesrequests, dispatchesjobs, validatesrequests;    public function login(request $request)    {        $data = uservalidate::make()->scene('login')->check($request->all());    }    public function register(request $request)    {        $data = uservalidate::make()->scene('register')->check($request->all());    }}
使用验证器的scene方法来指定当前需要验证的场景名称
验证中间件默认我们一个控制器对应一个验证器,一个方法对应一个场景名称,基于此特点,我们可以编写一些更为简易的方法来解决验证,我们可以编写一个中间件来解决此问题,点击查看文档说明,中间件完整命名空间为:itwmw\validate\middleware\laravel\validatemiddleware
中间件设置首先我们需要为他指定控制器和验证器的对应关系,在app/providers目录下新建一个validateserviceprovider.php文件,写入如下代码:
<?phpnamespace app\providers;use illuminate\support\serviceprovider;use itwmw\validate\middleware\validatemiddlewareconfig;class validateserviceprovider extends serviceprovider{ public function register() { validatemiddlewareconfig::instance() ->setautovalidatepath('app\\http\\controllers\\', 'app\\http\\validate\\');    }}
其中setautovalidatepath为指定控制器和验证器的对应关系,可以设定多个,不限制数量,然后我们将validateserviceprovider注册一下,在config/app.php文件中找到providers,在其中添加app\providers\validateserviceprovider::class
注意:不可以放在illuminate\validation\validationserviceprovider::class之前
使用中间件这个时候,我们可以将中间件注册为全局中间件,也可以不注册,注册方法:中间件《laravel 7 中文文档》
定义路由:
route::middleware(validatemiddleware::class)->group(function () {    route::any('/login', [\app\http\controllers\usercontroller::class, 'login']);    route::any('/register', [\app\http\controllers\usercontroller::class, 'register']);});
控制器代码修改如下:
class usercontroller extends basecontroller{    use authorizesrequests, dispatchesjobs, validatesrequests;    public function login(request $request)    {        $data = get_validate_data($request);    }    public function register(request $request)    {        $data = get_validate_data($request);    }}
这个时候,我们就不需要手动指定验证器已经场景名了,中间件会自动处理对应的验证规则,我们只需要使用get_validate_data方法来接收值即可。
结尾此文章只写了这个扩展的一些基本用法,还有更多的功能,需要大家自己看看文档,来完成自己合适的验证层。
更多laravel技术文章,请访问laravel教程栏目!
以上就是解析如何进行laravel表单验证分层设计和验证场景应用的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product