默认情况下,Laravel的基本控制器类使用ValidatesRequests特性,该特性提供了一种方便的方法,可以使用各种强大的验证规则验证传入的HTTP请求
确实如此,阅读代码App\Http\Controllers\Controller
实际上使用ValidatesRequests
特征。 ValidatesRequests
有validate
方法。
对我来说真正奇怪的是,文档中的其他任何地方都会在validate
对象上调用$request
方法。它以这种方式工作。我可以使用以下代码验证表单:
public function store()
{
$attributes = request()->validate([
'name' => 'required|string|max:255',
]);
// ...
}
但我没有在Request类上看到任何验证方法的存在。只是文件开头的一个奇怪的注释行:
/**
* @method array validate(array $rules, array $messages = [], array $customAttributes = [])
*/
所以有两件事:
$request
对象上运行。我的实际问题是:
如果我通过validate
对象使用$request
方法,我从文档中粘贴的初始引用是否仍然是真的?如果是这样,它是如何运作的?
答案 0 :(得分:4)
“奇怪的评论”是removed a couple days ago。
我相信Request
可以通过FoundationServiceProvider.php中的validate
来自Request::macro('validate', ...)
函数。有关宏的更多信息,请参阅this article。
答案 1 :(得分:1)
嗯,validate
方法就在那里,但它不是直接在FormRequest中,而是在ValidatesWhenResolvedTrait
特征中,所以它在FormRequest中没有任何问题,因此文档很好。
让我们来看看这个特性的开头:
trait ValidatesWhenResolvedTrait
{
/**
* Validate the class instance.
*
* @return void
*/
public function validate()
{
$this->prepareForValidation();
$instance = $this->getValidatorInstance();
if (! $this->passesAuthorization()) {
$this->failedAuthorization();
} elseif (! $instance->passes()) {
$this->failedValidation($instance);
}
}
所以当你在控制器中运行时:
request()->validate
您正在使用trait运行该方法,而ValidatesRequests
与此没有任何共同之处。
或者,如果您想使用“Controller way”验证,您可以这样做:
$this->validate(request(), [
'name' => 'required|string|max:255',
]);
现在您将使用validate
次请求中的ValidatesRequests
方法。
如您所见,Laravel中有多种运行验证的方法。我个人只使用表单请求验证。