我的控制器忽略了我的自定义验证规则

时间:2019-03-04 17:36:45

标签: validation laravel-5.2

我需要针对我的应用程序的自定义验证规则。作为概念证明,我创建了一个简单的验证规则。为了进行测试,passs方法返回false。我已将验证添加到控制器中,但是即使验证器返回false,控制器也会像验证成功一样继续进行。我使用调试器来确认passs方法确实被击中并返回false。

我为什么做错了?

这是我的规则班:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class UniqueAgent implements Rule
{

    protected $id;

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param mixed $id
     */
    public function setId($id): void
    {
        $this->id = $id;
    }

    /**
     * UniqueAgent constructor.
     */
    public function __construct($id)
    {
        $this->setId($id);
    }

    public function passes($attribute, $value)
    {
        // TODO: Implement passes() method.
        return false;
    }

    public function message()
    {
        // TODO: Implement message() method.
    }

}

这是控制器代码:

public function update(Request $request, $id)
{
    // UniqueAgent rule returns 'false'
    $validateData = $request->validate([
       'agency' => [
           'required',
           new UniqueAgent($id)
       ]
     ]);
    $agent = Agent::findOrFail($id)
    $agent->agency = $request->input('agency');
    $agent->save();
 }

谢谢

1 个答案:

答案 0 :(得分:0)

问题解决了。对于任何感兴趣的人,我都没有向UniqueAgent类的message方法添加返回值。我添加了返回“某些字符串”,现在控制器将客户端重定向到查看并显示错误消息。

我认为这是一个糟糕的设计。如果不返回消息字符串,导致该类无法按预期执行,则它不应只是安静地失败。我认为,最好是在验证失败(即重定向到视图)时,无论有无错误消息,控制器都简单地执行操作。