我是自定义验证器,见下文(简化)
public function rules()
{
return [
'amount' => 'required|numeric|max_invest:10000'
];
}
public function messages()
{
return [
'max_invest' => 'You can invest max :mi' // I want to set :mi on the fly
];
}
public function validateMaxInvestment($attribute, $value, $parameters, $validator)
{
$this->setAttributeNames(['mi' => intval($parameters[0] - $value)]); // Try to set the attribute mi on the fly
return $value < $parameters[0];
}
我确实在服务提供商的启动方法中注册了验证器,如下所示:
$this->app['validator']->extend('maxInvestment',
'MaxInvestmentValidator@validateMaxInvestment');
验证器工作正常,但我收到的消息仍然存在:
您可以投资最高:mi
调用方法setAttributeNames
不会生效。
答案 0 :(得分:0)
您需要使用替换器,因为它位于documentation的底部,您可能会错过。
创建自定义验证规则时,有时可能需要 定义错误消息的自定义占位符替换。你可能会这样做 所以通过创建一个如上所述的自定义验证器,然后制作一个 调用Validator外观上的replacer方法。你可以这样做 在服务提供商的启动方法中:
public function boot() {
Validator::extend(...);
Validator::replacer('foo', function($message, $attribute, $rule, $parameters) {
return str_replace(...);
});
}
因此,对于您的情况,下面的内容应该有效。
protected function validateMaxInvestment($attribute, $value, $parameters, $validator)
{
$replace = intval($parameters[0] - $value);
$validator->addReplacer('max_invest', function ($message) use ($replace) {
return str_replace(':mi', $replace, $message);
});
return $value < $parameters[0];
}
另外,不确定,但我想你也可以做下面的事情。
protected function validateMaxInvestment($attribute, $value, $parameters, $validator)
{
return $value < $parameters[0];
}
protected function replaceMaxInvestment($message, $attribute, $rule, $parameters)
{
$replace = intval($parameters[0] - \Input::get($attribute));
return str_replace(':mi', $replace, $message);
}
因此,您可能需要再次注册。
$this->app['validator']->replacer('maxInvestment', 'MaxInvestmentValidator@replaceMaxInvestment');