请问 Request 中 attributes 有什么用呢?

Request 中,我看都写了 attributes() 方法,但是这个方法有什么作用呢,没看到调用,而且laravel 5.5 Request 中也没有介绍到这个方法。

    public function attributes()
        {
          return [
            'title' => '标题',
            'body' => '话题内容',
            'category_id' => '分类',
          ];
        }
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
  • 此方法是用来设置验证失败时字段(attributes)的名称应该如何显示。
    • \Illuminate\Foundation\Http\FormRequest::attributes
      //Get custom attributes for validator errors.
      public function attributes()
      {
      return [];
      }
  • 由于 class TopicRequest extends FormRequest, 因此在 class TopicRequest 添加 attributes 方法就是设置 验证失败时字段(attributes)的名称。
  • 从源码分析的话,就比较复杂了:

    • 首先,需要知道是什么时候设置的这些字段的显示名。
    • trace 如下:
      Illuminate\Validation\Validator->__construct()
      Illuminate\Validation\Factory->resolve()
      Illuminate\Validation\Factory->make()
      App\Http\Requests\Api\TopicRequest->createDefaultValidator()
      App\Http\Requests\Api\TopicRequest->getValidatorInstance()
      App\Http\Requests\Api\TopicRequest->validateResolved()
      Illuminate\Foundation\Providers\FormRequestServiceProvider->Illuminate\Foundation\Providers\{closure}()
    • 因为 class FormRequest 使用了 ValidatesWhenResolvedTrait,因此在注入 TopicRequest时会去执行 validateResolved()方法,从而创建一个新的 Validator instance,在这里就设置了 $this->customAttributes = $customAttributes;,这里的customAttributes就是 \App\Http\Requests\Api\TopicRequest::attributes中的字段显示名。
    • 接下来,需要知道什么时候显示这些名称。
    • trace如下
      Illuminate\Validation\Validator->getDisplayableAttribute()
      Illuminate\Validation\Validator->makeReplacements()
      Illuminate\Validation\Validator->addFailure()
      Illuminate\Validation\Validator->validateAttribute()
      Illuminate\Validation\Validator->passes()
      Illuminate\Validation\Validator->fails()
      App\Http\Requests\Api\TopicRequest->validateResolved()
    • \Illuminate\Validation\Concerns\FormatsMessages::getDisplayableAttribute中,可以看到如下代码
      // The developer may dynamically specify the array of custom attributes on this
      // validator instance. If the attribute exists in this array it is used over
      // the other ways of pulling the attribute name for this given attributes.
      if (isset($this->customAttributes[$name])) {
          return $this->customAttributes[$name];
      }
    • 这里的customAttributes就是上面注入TopicRequest时设置的。
    • 注入request类的验证逻辑代码主要在\Illuminate\Validation\ValidatesWhenResolvedTrait::validateResolved中,从这里发散开去看源码。

      /**
          * Validate the class instance.
          *
          * @return void
          */
      public function validateResolved()
      {
          $this->prepareForValidation();
      
          if (! $this->passesAuthorization()) {
              $this->failedAuthorization();
          }
      
          $instance = $this->getValidatorInstance();
      
          if ($instance->fails()) {
              $this->failedValidation($instance);
          }
      }
5年前 评论
讨论数量: 2
liyu001989

设置请求参数错误时,各个字段的名称

5年前 评论
  • 此方法是用来设置验证失败时字段(attributes)的名称应该如何显示。
    • \Illuminate\Foundation\Http\FormRequest::attributes
      //Get custom attributes for validator errors.
      public function attributes()
      {
      return [];
      }
  • 由于 class TopicRequest extends FormRequest, 因此在 class TopicRequest 添加 attributes 方法就是设置 验证失败时字段(attributes)的名称。
  • 从源码分析的话,就比较复杂了:

    • 首先,需要知道是什么时候设置的这些字段的显示名。
    • trace 如下:
      Illuminate\Validation\Validator->__construct()
      Illuminate\Validation\Factory->resolve()
      Illuminate\Validation\Factory->make()
      App\Http\Requests\Api\TopicRequest->createDefaultValidator()
      App\Http\Requests\Api\TopicRequest->getValidatorInstance()
      App\Http\Requests\Api\TopicRequest->validateResolved()
      Illuminate\Foundation\Providers\FormRequestServiceProvider->Illuminate\Foundation\Providers\{closure}()
    • 因为 class FormRequest 使用了 ValidatesWhenResolvedTrait,因此在注入 TopicRequest时会去执行 validateResolved()方法,从而创建一个新的 Validator instance,在这里就设置了 $this->customAttributes = $customAttributes;,这里的customAttributes就是 \App\Http\Requests\Api\TopicRequest::attributes中的字段显示名。
    • 接下来,需要知道什么时候显示这些名称。
    • trace如下
      Illuminate\Validation\Validator->getDisplayableAttribute()
      Illuminate\Validation\Validator->makeReplacements()
      Illuminate\Validation\Validator->addFailure()
      Illuminate\Validation\Validator->validateAttribute()
      Illuminate\Validation\Validator->passes()
      Illuminate\Validation\Validator->fails()
      App\Http\Requests\Api\TopicRequest->validateResolved()
    • \Illuminate\Validation\Concerns\FormatsMessages::getDisplayableAttribute中,可以看到如下代码
      // The developer may dynamically specify the array of custom attributes on this
      // validator instance. If the attribute exists in this array it is used over
      // the other ways of pulling the attribute name for this given attributes.
      if (isset($this->customAttributes[$name])) {
          return $this->customAttributes[$name];
      }
    • 这里的customAttributes就是上面注入TopicRequest时设置的。
    • 注入request类的验证逻辑代码主要在\Illuminate\Validation\ValidatesWhenResolvedTrait::validateResolved中,从这里发散开去看源码。

      /**
          * Validate the class instance.
          *
          * @return void
          */
      public function validateResolved()
      {
          $this->prepareForValidation();
      
          if (! $this->passesAuthorization()) {
              $this->failedAuthorization();
          }
      
          $instance = $this->getValidatorInstance();
      
          if ($instance->fails()) {
              $this->failedValidation($instance);
          }
      }
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!