2016-06-14 41 views
0

我有一個自定義的驗證,見下文(簡體)Laravel 5.2 |設定Calculcated值自定義屬性的飛行從未更換

表單請求

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', 
     '[email protected]'); 

問題

驗證器工作正常,但消息我得到住宿:

你可以投資最大:mi

調用setAttributeNames不生效的方法。

回答

0

您需要使用代用品用於此目的,您可能會錯過它,因爲它位於documentation的底部。

創建自定義驗證規則時,有時可能需要 爲錯誤消息定義自定義佔位符替換。你可以做 ,所以通過創建一個如上所述的自定義驗證器,然後在Validator Facade上調用替代方法的 。您可以在服務提供商的引導方法中做到這一點 :

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', '[email protected]');