【问题标题】:Why is validate() method accessible via request()?为什么 validate() 方法可以通过 request() 访问?
【发布时间】:2018-04-30 06:26:48
【问题描述】:

引用Laravel documentation

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

是的,阅读代码,App\Http\Controllers\Controller 实际上使用了ValidatesRequests trait。而ValidatesRequests 有一个validate 方法。

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

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

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

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

所以有两件事:

  • 我不知道在 Laravel 文档中应该信任什么。
  • 我不明白验证如何在 $request 对象上工作。

我的实际问题是:

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

【问题讨论】:

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


    【解决方案1】:

    那个“奇怪的评论”是removed a couple days ago

    我相信RequestFoundationServiceProvider.php 中的Request::macro('validate', ...) 调用中获得了它的validate 函数。有关宏的更多信息,请参阅this article

    【讨论】:

    • 好的,谢谢!那么你认为ValidatesRequests 在这种情况下没有用,而现在 Laravel 的初始报价无关紧要吗? (因为在初始引用之后编写整个文档的方式没有考虑到存在 ValidatesRequests 特征)
    • @rap-2-h 不,这不是没用的。它们适用于不同的情况。 控制器上的$this->validate()request()->validate() 不是一回事。
    • 糟糕,对不起,我不是说“没用”(无论如何,我写的)。我想问:“那么在这种情况下,您认为 ValidatesRequests 未使用 [...]?”。无论如何,谢谢!
    • 在这种情况下,答案将是“对,ValidatesRequestsrequest()->validate() 呼叫没有关系 - 它不涉及”。
    • 路过的投票者是否希望解释我做错了什么?
    【解决方案2】:

    好吧,validate 方法在那里,但它不是直接在 FormRequest 中,而是在 ValidatesWhenResolvedTrait trait 中,所以它可以在 FormRequest 中毫无问题地使用,所以文档很好。

    让我们看看这个 trait 的开头:

    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 与此没有任何共同之处。

    或者,如果您想使用“控制器方式”验证,您可以这样做:

    $this->validate(request(), [
            'name' => 'required|string|max:255',
        ]);
    

    现在您将使用来自ValidatesRequests 请求的validate 方法。

    如您所见,在 Laravel 中有多种运行验证的方法。我个人只使用表单请求验证。

    【讨论】:

    • 谢谢!我有点失落。您确定这个validate 方法是我在调用request()->validate(...) 时提供的示例中调用的方法吗?我在这个中没有看到任何参数,而且似乎不是出于相同的目的......(但也许我错了,有时我迷失了 Laravel 的“神奇”一面)。
    • 我刚刚更新了我的答案。当您运行 request()->validate() 时,您将运行我在答案开头向您展示的方法,如果您正在运行 $this->validate(request() 您正在运行来自 ValidateRequests 控制器特征的方法
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多