惊喜!终于找到了 Laravel-admin 中使用 [请求类] 验证表单的方法,以及 [唯一验证] 的兼容写法
虽然 admin 中文文档 给出了验证规则的编写方法,但是并没有介绍怎么使用已有的请求类进行验证 。你将不得不编写类似于 $form->text('title')->rules('required|min:3');
这样的多条 rules ()
经过数小时的探索,我终于找到了更加优雅的写法。只需要在继承 AdminController 的控制器里面覆写一个 store () 函数即可,如下所示
class UserController extends AdminController
{
public function store()
{
app(UserRequest::class);
return $this->form()->store();
}
...
}
这个函数里面的关键代码是 app(UserRequest::class)
,只需要把请求类的名称用 app () 函数套一下就 OK 了!如果控制器调用的是 update () 方法,则覆写 update () 方法(代码与上面的类似)。效果如下图
或许大家会想到下面这样的写法,写法是优雅,可惜会报错 Declaration of App\Admin\Controllers\UserController::store(App\Http\Requests\UserRequest $request) should be compatible with Encore\Admin\Controllers\AdminController::store()
public function store(UserRequest $request) // v1.7.9 报错
{
return $this->form()->store();
}
本例安装的 encore/laravel-admin 版本为 1.7.9
【唯一验证】的兼容写法#
假设前台用户可以修改自己的 Email,只要不跟别人的重复就行。下面这条规则虽然确保了唯一性,但是在前台用户只修改个人简介,并且不打算修改 Email 的情况下也会导致验证失败'email'=> 'required|email|unique:users'
修改成下面这样,的确可以解决上面的问题,此时前台用户可以顺利更新资料。但是又会导致后台更新用户资料失败,因为管理员登录的时候 Auth::id () 已经不等于前台用户的 id 了'email'=> 'required|email|unique:users,email,'. Auth::id(),
改进的写法稍微复杂了点,如果是后台登录, route (‘user’) 是个数字;如果是前台用户登录, route (‘user’) 是一个对象$id= request()->route('user');
if(is_object($id))
$id= $id->id;
如果是用户本人修改,上面获取 id 的写法与 Auth::id()
获取的 id 相同;如果是管理员登录,更新操作的 url 类似于这样 http://xxx.xxx.xxx/admin/users/30/edit 此时 request()->route('user')
不是对象,而是数字 30。如此一来便实现了【前、后台请求类的兼容写法】。
public function rules() {
$id= request()->route('user');
if(is_object($id))
$id= $id->id;
return [
// 'email'=> 'required|email|unique:users', //坏,本人修改失败
// 'email'=> 'required|email|unique:users,email,'. Auth::id(), //坏,后台修改失败
'email'=> 'required|email|unique:users,email,'. $id, //好!前后台都可以
];
}
以下 gif 图片对比了上述三行代码的效果。其中搜狗浏览器展示的是前台用户本人修改的情况;火狐浏览器展示的是管理员在后台进行更新的情况。
这里顺便提一下 admin 中文文档 介绍的一种写法 updateRules(['required', "unique:user_table,username,{{id}}"])
,这里面的 {{id}} 估计是 Laravel-admin 自己定义的一套标记,写在请求类中是不行的,laravel 框架不认识这样的标记。
还可以设置双重验证#
在请求类里面编写前、后台共用的验证,并辅以 admin 后台的 rules () 函数进行第二重独有的验证。以上动画关于姓名字符串长度的验证就是二重验证的一个示例(用户本人修改没这限制,直接通过;后台修改的时候,由于 name 字段添加了额外的 rules (‘min:2’) 形成二重验证)。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: