Laravel 5.2 |在飞行中设置带有计算值的自定义属性从未替换

时间:2016-06-14 11:26:34

标签: validation attributes laravel-5.2

我是自定义验证器,见下文(简化)

表单请求

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不会生效。

1 个答案:

答案 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');