为什么要通过request()访问validate()方法?

时间:2017-11-16 16:13:58

标签: php laravel laravel-5 laravel-5.5 laravel-validation

引用Laravel documentation

  

默认情况下,Laravel的基本控制器类使用ValidatesRequests特性,该特性提供了一种方便的方法,可以使用各种强大的验证规则验证传入的HTTP请求

确实如此,阅读代码App\Http\Controllers\Controller实际上使用ValidatesRequests特征。 ValidatesRequestsvalidate方法。

对我来说真正奇怪的是,文档中的其他任何地方都会在validate对象上调用$request方法。它以这种方式工作。我可以使用以下代码验证表单:

public function store()
{
    $attributes = request()->validate([
        'name' => 'required|string|max:255',
    ]);
    // ...
}

但我没有在Request类上看到任何验证方法的存在。只是文件开头的一个奇怪的注释行:

/**
 * @method array validate(array $rules, array $messages = [], array $customAttributes = [])
 */

所以有两件事:

  • 我不知道在Laravel文档中应该信任什么。
  • 我不了解验证如何在$request对象上运行。

我的实际问题是:

如果我通过validate对象使用$request方法,我从文档中粘贴的初始引用是否仍然是真的?如果是这样,它是如何运作的?

2 个答案:

答案 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中有多种运行验证的方法。我个人只使用表单请求验证。