首页 > 解决方案 > 规则对象不触发 pass() 方法

问题描述

我正在尝试使用规则实现验证以验证模型中的字段;如官方文档中所示,以这种方式:

1) 在文件夹 App/Rules 我把文件 Um.php:

<?php
 namespace App\Rules;
 use Illuminate\Contracts\Validation\Rule;
 use App\Models\Common\Item;
 class Um implements Rule
  {

/**
 * Determine if the validation rule passes.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function passes($attribute, $value)
{
    if(strlen($attribute) < 5)
    return false;

    return true;
}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return 'The field is too short ';
}

}

2)在我的控制器类中,在方法更新中:

 use App\Rules\Um as RuleUm;

...

  public function update(Request $request $item)
{
   //$item is the model don't worry for this 


   //Here is where I invoke the rule 
    $request->validate([
'codum' => [ new RuleUm],
            ]);


    $item->update($request->input());

  //...son on
}

到目前为止一切顺利,更新数据后出现问题;pass() 方法被完全忽略;并恰好执行更新。这不依赖于方法的逻辑,因为无论如何它仍然返回 false,就像 Laravel 仍然忽略该方法一样,它没有被执行。

有人能帮我吗?我究竟做错了什么?

标签: laravelvalidationrules

解决方案


如果您正在处理自定义 Rule 类,它不会验证字段(在您的情况下为 codum)是否为空或请求中不存在。如果您希望自定义验证对象在值为空的情况下运行,则需要使用ImplicitRule合同。

相同的请参见这篇文章

简而言之,您需要这样做:

class Um implements ImplicitRule

推荐阅读