2016-05-15 153 views
1

我控制器上我有:條件驗證

public function store(ProductRequest $request) 

請求:

class ProductRequest extends Request 
{ 
    public function rules() 
    { 
     return [ 
      'name' => 'required|min:3', 
      'perTypeTime' => 'sometimes|required', 
      'per_type_id' => 'required' 
     ]; 
    } 
} 

我想改變上述perTypeTime規則取決於如果per_type_id場是有條件的== 1.

如果我在控制器中啓動驗證程序,我相信我可以執行以下操作:

$v = Validator::make($data, [ 
    'per_type_id' => 'required|email' 
]); 

$v->sometimes('perTypeTime', 'required|max:500', function($input) 
{ 
    return $input->per_type_id == 1; 
}); 

有沒有辦法做到這一點,同時保持我的自定義請求。我喜歡這種方法如何保持控制器清潔。

我似乎無法訪問請求對象上的驗證器。有沒有一種方法可以在請求本身內指定這個條件,或者從請求對象訪問驗證器,或者有另一種方法嗎?

回答

2

你可以做到這一點

我想改變上述perTypeTime規則取決於你的ProductRequest如果per_type_id場== 1

rules()方法中是有條件的。 詳情請參閱required_if:其他字段,值Laravel documentation validation rules

public function rules() 
{ 
    return [ 
     'name'   => 'required|min:3', 
     'perTypeTime' => 'required_if:per_type_id,1', 
     'per_type_id' => 'required' 
    ]; 
} 
+0

這種方法是罰款這一特定使用案例,但它並沒有解決的根源問題:如果我有一個非常特殊的驗證,比如'userIsAGoat()',那麼該怎麼辦? – Noir

3

Laravel 5.3,在你的請求文件,您可以添加:

use Illuminate\Validation\Factory; 

...

public function validator(Factory $factory) 
{ 
    $validator = $factory->make($this->input(), $this->rules()); 
    $validator->sometimes('your_sometimes_field', 'your_validation_rule', function($input) { 
     return $input->your_sometimes_field !== null; 
    }); 
    return $validator; 
} 
+0

覆蓋驗證器功能。這是我正在尋找的,謝謝。 – suarsenegger

+0

此解決方案自[Laravel 5](https://github.com/laravel/framework/blob/5.0/src/Illuminate/Foundation/Http/FormRequest。php#L75),所以它也適用於5.3之前的版本。 – mauricius

0

其實這個答案https://stackoverflow.com/a/41842050/3922975是不是最好的。 我們不必用我們自己的替換默認驗證器(因爲我們沒有改變任何東西)。在那個解決方案中,我們希望驗證工廠總是隻需要兩個屬性($ this-> input(),$ this-> rules()),即使在編寫時也是如此。

這是Laravel使用默認的驗證:

$factory->make(
    $this->validationData(), 
    $this->container->call([$this, 'rules']), 
    $this->messages(), 
    $this->attributes() 
); 

正如你可以看到它是非常不同於阿爾喬姆Verbo使用。

更好的辦法是在你的ProductRequest類創建withValidator方法:

use Illuminate\Contracts\Validation\Validator; 

...

public function withValidator(Validator $validator) 
{ 
    $validator->sometimes('your_sometimes_field', 'your_validation_rule', function ($input) { 
     return $input->your_sometimes_field !== null; 
    }); 
}