Laravel中如何向UpdateUserRequest传递用户信息?
解决Laravel UpdateUserRequest中获取User实例的问题
你可以通过以下几种标准方式在UpdateUserRequest中获取路由绑定的User实例,无需额外修改路由逻辑:
方法1:通过route()方法直接获取路由参数
Laravel的路由模型绑定已经将User实例注入到请求的路由参数中,直接调用$this->route('user')即可获取(这里的user对应你路由定义中的参数名,比如Route::put('/users/{user}', ...))。
use Illuminate\Foundation\Http\FormRequest; use App\Models\User; class UpdateUserRequest extends FormRequest { public function authorize(): bool { // 直接在这里完成授权验证(也可保留UserPolicy的逻辑) return $this->user()->can('update', $this->route('user')); } public function rules(): array { $user = $this->route('user'); return [ 'username' => 'required|unique:users,username,' . $user->id, // 其他验证规则... ]; } }
方法2:使用Laravel内置的Rule::unique()优雅写法
可以直接将User实例传入ignore()方法,避免手动拼接ID,代码更简洁易维护:
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; use App\Models\User; class UpdateUserRequest extends FormRequest { public function authorize(): bool { return $this->user()->can('update', $this->route('user')); } public function rules(): array { return [ 'username' => [ 'required', Rule::unique('users')->ignore($this->route('user')), ], // 其他验证规则... ]; } }
方法3:封装getter方法复用实例
如果需要在多个方法(比如messages()、prepareForValidation())中复用User实例,可以封装一个getter方法:
use Illuminate\Foundation\Http\FormRequest; use App\Models\User; class UpdateUserRequest extends FormRequest { private ?User $user = null; public function authorize(): bool { return $this->user()->can('update', $this->getUser()); } public function rules(): array { return [ 'username' => 'required|unique:users,username,' . $this->getUser()->id, // 其他验证规则... ]; } private function getUser(): User { if (!$this->user) { $this->user = $this->route('user'); } return $this->user; } }
补充说明
之前代码中$user未定义的原因是:UpdateUserRequest类本身不会自动注入路由绑定的User实例,而控制器的update()方法是通过Laravel的依赖注入机制获取到的。通过$this->route('user')获取实例是Laravel官方推荐的标准方式,并非“不合适的路由解决方法”,而是利用路由模型绑定特性实现的规范操作。
内容的提问来源于stack exchange,提问作者Zakk
相关产品推荐
相关产品推荐

