我的应用程序需要一个自定义验证规则。作为概念证明,我创建了一个简单的验证规则。出于测试目的,pass方法返回false。我将验证添加到我的控制器,但即使验证器返回false,控制器也会继续进行,就像验证成功一样。我使用调试器来确认pass方法确实被命中并返回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();
}
谢谢
问题解决了。对于任何感兴趣的人,我没有在UniqueAgent类的message方法中添加返回值。我添加了一个返回“some string”,现在控制器重定向客户端以查看并显示错误消息。
在我看来,这是一个糟糕的设计。如果没有返回消息字符串导致类不能按预期执行,那么它不应该只是安静地失败。在我看来,如果控制器只是在验证失败时(即,重定向到视图)完成它所做的事情,有或没有错误消息,那将更好。