2017-09-05 82 views
0

我從這裏看到:https://github.com/andersao/laravel-validator如何在驗證器界面laravel中添加條件?

例如,這樣的代碼:

use \Prettus\Validator\LaravelValidator; 

class PostValidator extends LaravelValidator { 

    protected $rules = [ 
     ValidatorInterface::RULE_CREATE => [ 
      'title' => 'required', 
      'text' => 'min:3', 
      'author'=> 'required' 
     ], 
     ValidatorInterface::RULE_UPDATE => [ 
      'title' => 'required' 
     ] 
    ]; 

} 

我想,如果用戶是成員(if(Auth::id()))來添加條件,那麼不需要

現場筆者因此,驗證程序是這樣的:

ValidatorInterface::RULE_CREATE => [ 
     'title' => 'required', 
     'text' => 'min:3' 
], 

如果用戶是客人所需要的作者(無LO杜松子酒)

是否可以做到?

回答

0

Laravel documentation對定製一款驗證器

+0

請仔細閱讀我的問題。我使用不同的包 –

+0

從我所看到的你仍然需要定義定製邏輯,該包只是一個建築界面 – Quezler

0

因爲你不能在一個類屬性執行指令,你可以嘗試重寫您Repository實例的create方法,以修改$rules參數之前的實際創建發生。

因此,在你Repository類,覆蓋的方法create

public function create(array $attributes) 
{ 

    $oldRule = $this->rules[ValidatorInterface::RULE_CREATE]['author']; 

    if(Auth::guest()){ // or use the preferred check 
     unset($this->rules[ValidatorInterface::RULE_CREATE]['author']); 
    } 

    $this->makeValidator(); 
    $res = parent::create($attributes); 

    $this->rules[ValidatorInterface::RULE_CREATE]['author'] = $oldRule; 

    return $res; 
} 

編輯

另一種方法可以在您的PostValidator可以指定自定義驗證邏輯如下:

use \Prettus\Validator\LaravelValidator; 

class PostValidator extends LaravelValidator { 

    const RULE_CREATE_FOR_MEMBER = 'RULE_CREATE_FOR_MEMBER'; 

    protected $rules = [ 
     ValidatorInterface::RULE_CREATE => [ 
      'title' => 'required', 
      'text' => 'min:3', 
      'author'=> 'required' 
     ], 
     self::RULE_CREATE_FOR_MEMBER => [ 
      'title' => 'required', 
      'text' => 'min:3' 
     ], 
     ValidatorInterface::RULE_UPDATE => [ 
      'title' => 'required' 
     ] 
    ]; 

    public function passes($action = null) 
    { 
     if($action == ValidatorInterface::RULE_CREATE && \Auth::id()) { 
      $action = self::RULE_CREATE_FOR_MEMBER; 
     } 

     return parent::passes($action); 
    } 

} 

但是,再次,你需要重寫標準行爲,我您可以根據自己的需求來決定哪種解決方案最簡單。

+0

看起來很複雜。我認爲它似乎能夠在PostValidator類中添加條件 –

+0

在我看來這並不複雜。另一種方法是爲不同的用戶類型(登錄用戶或訪客)設置不同的驗證器。唯一的問題是,當在你的控制器上實例化repo時,我不確定Auth對象是否會在你的控制器的構建時被實例化。 – Desh901

+0

在這兩種情況下,你都必須重寫驗證器的標準功能。如果你要覆蓋你的驗證器類,你需要重寫'passes'方法並提供你的修改規則。 – Desh901

相關問題