本篇文章给大家分享的是有关Laravel中怎么实现表单验证分层设计,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

白沙黎族ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
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文件,写入如下代码:
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);
}}以上就是Laravel中怎么实现表单验证分层设计,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。