Laravel 8扩展Backpack PermissionManager的UserCrudController时更新用户触发注册类验证错误的问题排查
问题:Backpack PermissionManager更新用户时被识别为创建操作,触发邮箱重复和密码必填验证
我来帮你分析问题所在,以及给出修复方案:
问题根源
你的setupUpdateOperation方法里直接调用了setupCreateOperation(),这会导致创建操作的验证规则被加载到更新流程中。
原UserCrudController的setupCreateOperation()会设置创建用户的验证规则:
- 邮箱必须全局唯一(
unique:users) - 密码为必填项
而更新操作的验证规则本来应该是:
- 邮箱只需排除当前用户本身的唯一性(
unique:users,id,{当前用户ID}) - 密码为可选(用户不修改密码时无需填写)
当你在更新流程中调用setupCreateOperation(),相当于把创建的验证规则强制套用到了更新操作上,所以修改现有用户时,系统会错误地用创建用户的规则去校验:
- 邮箱因为已经存在(当前用户自己的邮箱),触发
The email has already been taken - 没有填写密码,触发
The password field is required
修复方案
把添加自定义字段的逻辑抽离成独立方法,避免在更新操作中引入创建流程的验证规则。修改后的控制器代码如下:
namespace App\Http\Controllers\Admin; use Backpack\PermissionManager\app\Http\Controllers\UserCrudController; use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD; class UserController extends UserCrudController { // 抽离添加部门字段的公共方法 private function addDepartmentField() { $departmentField = [ 'label' => 'Departments', 'type' => 'select2_multiple', 'name' => 'tags', 'entity' => 'tags', 'attribute' => 'name', 'model' => "App\Models\Tag", 'pivot' => true, 'wrapper' => ['class' => 'form-group col-6 col-md-4'], 'options' => (function ($query) { return $query->where('type', 'Department')->get(); }), ]; CRUD::addField($departmentField); } public function setupCreateOperation() { parent::setupCreateOperation(); // 创建用户时添加部门字段 $this->addDepartmentField(); } public function setupUpdateOperation() { parent::setupUpdateOperation(); // 更新用户时单独添加部门字段,不再调用setupCreateOperation $this->addDepartmentField(); } }
额外说明
如果之后需要自定义更新操作的验证规则,可以在setupUpdateOperation中手动设置,比如:
public function setupUpdateOperation() { parent::setupUpdateOperation(); $this->addDepartmentField(); // 自定义更新验证规则(可选,根据需求调整) CRUD::setValidation([ 'name' => 'required|min:2|max:255', 'email' => 'required|email|unique:users,id,'.CRUD::getCurrentEntryId(), 'password' => 'nullable|min:6|confirmed', ]); }
这样就能保证创建和更新操作各自使用正确的验证规则,同时都能显示自定义的部门字段。
内容的提问来源于stack exchange,提问作者Bonn
相关产品推荐
相关产品推荐

