Laravel:为自定义HasColumn验证规则设置名称以简化调用
如何为自定义Laravel验证规则注册字符串别名?
我来帮你搞定这个问题!你已经写好了HasColumn验证规则,现在想把实例化调用的方式简化成字符串形式(比如has_column,users)对吧?其实只需要在Laravel的服务提供者里给这个规则注册一个别名就行,具体步骤如下:
1. 在服务提供者中注册规则别名
打开app/Providers/AppServiceProvider.php,在boot()方法里添加规则注册逻辑:
use Illuminate\Support\Facades\Validator; use App\Rules\HasColumn; public function boot() { // 注册has_column验证规则别名 Validator::extend('has_column', function ($attribute, $value, $parameters, $validator) { // 从参数中获取数据表名(逗号分隔的第一个参数) $table = $parameters[0] ?? ''; // 实例化我们的规则并调用passes方法 return (new HasColumn($table))->passes($attribute, $value); }); // 可选:自定义错误消息替换,让消息显示具体表名 Validator::replacer('has_column', function ($message, $attribute, $rule, $parameters) { // 把消息中的:table替换为实际的表名 return str_replace(':table', $parameters[0], $message); }); }
2. 调整错误消息(可选)
如果你想让错误消息更精准(比如显示具体是哪个表的列),可以修改HasColumn类的message()方法:
public function message() { return 'The :attribute must be a valid column in the :table table.'; }
这样结合上面的replacer,错误消息就会自动替换:table为你传入的表名(比如users),显示成The column must be a valid column in the users table.。
3. 简化调用方式
现在你就可以像预期的那样,用字符串形式调用这个验证规则了:
$req->validate([ 'column' => 'has_column,users' ]);
如果以后需要扩展规则支持更多参数,只需要在逗号后添加参数,然后在extend的闭包里从$parameters数组中获取对应的值即可。
内容的提问来源于stack exchange,提问作者JacopoStanchi
相关产品推荐
相关产品推荐

