Laravel自定义Rule类中如何在passes方法获取其他请求参数?
在Laravel自定义Rule中访问Request参数的解决方案
这里有两种实用的方法,能让你在TestCustom规则的passes方法里轻松获取$request->important参数,完成对name字段的验证:
方法一:构造函数注入Request(推荐,利于测试)
通过Laravel的服务容器,我们可以把Request对象直接注入到自定义Rule的构造函数中,这样就能在整个类里便捷使用它:
use Illuminate\Http\Request; use Illuminate\Contracts\Validation\Rule; class TestCustom implements Rule { // 声明属性存储Request实例 protected $request; // 构造函数注入Request public function __construct(Request $request) { $this->request = $request; } public function passes($attribute, $value) { // 获取important参数值 $importantValue = $this->request->input('important'); // 这里编写你的具体验证逻辑,举个示例: return $value === $importantValue; } public function message() { return '名称必须与重要参数匹配'; } }
使用时完全不用修改你原有的代码——Laravel会自动帮你注入Request实例:
use App\Rules\TestCustom; $request->validate([ 'name' => ['required', new TestCustom], 'important' => ['required', 'string'], ]);
方法二:在passes方法中直接获取Request实例
如果觉得构造函数注入有点繁琐,也可以直接在passes方法里用辅助函数快速获取Request:
use Illuminate\Contracts\Validation\Rule; use Illuminate\Http\Request; class TestCustom implements Rule { public function passes($attribute, $value) { // 通过app()辅助函数拿到Request实例 $request = app(Request::class); $importantValue = $request->input('important'); // 你的验证逻辑 return $value === $importantValue; } public function message() { return '名称必须与重要参数匹配'; } }
小提醒
因为你已经给important字段加了required规则,只要请求能走到name的验证环节,important参数就一定存在。如果担心验证顺序问题,也可以把important的验证规则放在name前面,不过其实不管顺序,Request里的原始参数都是可以直接获取的。
内容的提问来源于stack exchange,提问作者Bolek Lolek
相关产品推荐
相关产品推荐

