2017-09-05 88 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