【问题标题】:What is the use of After Validation Hook in Laravel 5Laravel 5中After Validation Hook有什么用
【发布时间】:2015-11-17 20:02:40
【问题描述】:

我正在学习 Laravel 5 并尝试验证数据库中是否存在电子邮件,如果失败则添加一些自定义消息。我在 Laravel 的文档中找到了 After Validation Hook

$validator = Validator::make(...);

$validator->after(function($validator) use ($email) {
    if (emailExist($email)) {
        $validator->errors()->add('email', 'This email has been used!');
    }
});

if ($validator->fails()) {
    return redirect('somewhere')
        ->withErrors($validator);
}

但我真的不明白这是什么。因为我可以简单地这样做:

//as above

if (emailExist($email)) {
    $validator->errors()->add('email', 'This email has been used!');
}

//redirect as above

它仍然输出相同的结果。我什么时候应该使用第一个而不是第二个来验证某些东西?

【问题讨论】:

    标签: php validation laravel-5 laravel-5.1


    【解决方案1】:

    第一种方法的重点是保留 Validator 对象中包含的所有内容,以使其更易于重用。

    是的,在您的情况下,它的作用完全相同。但是想象一下,如果您想验证多个项目。

    foreach ($inputs as $input) {
        $validator->setData($input);
    
        if ($validator->fails()) { ... }
    }
    

    在您的情况下,您必须将“if”检查添加到循环中。现在想象必须在许多不同的地方(多个控制器,可能是控制台脚本)运行此验证。现在你在 3 个不同的文件中有这个 if 语句,下次你去修改它时,你的工作量是原来的 3 倍,也许你忘记在一个地方改变它......

    我想不出很多用例,但这就是它背后的基本理念。

    顺便说一句,有一个名为 exists 的验证规则可能会处理您的 emailExist() 方法

    $rules = [
        'email' => 'exists:users,email',
    ];
    

    http://laravel.com/docs/5.1/validation#rule-exists

    【讨论】:

    • 谢谢。效果很好,exists 规则真的很有用,可以节省很多时间
    【解决方案2】:

    passedValidation 方法会在 FormRequest 类中验证通过时触发。实际上这个方法是afterValidation 方法的重命名。 See: method rename Commit

    所以你可以这样做

    class RegistrationRequest extends FormRequest
    {
    
         /**
         * Handle a passed validation attempt.
         *
         * @return void
         */
        protected function passedValidation()
        {
            $this->merge(
                [
                    'password'  => bcrypt($this->password),
                ]
            );
        }
    }
    

    【讨论】:

      【解决方案3】:

      在许多情况下,您可能会觉得这是必需的。

      假设您正在尝试为项目构建 REST api。并且您已决定更新请求方法不会对请求中的任何字段进行任何必需的规则验证(因为可能有很多参数并且您不希望仅仅为了更改一列而将它们全部传递,或者您可能没有所有列,因为您无权访问它)。

      那么您将如何在 UpdatePostRequest.php 类中处理此验证,您已将所有验证规则放入代码中给出的 rules() 方法中。

      此外,可能要求两个或多个请求字段的值之和应大于或小于某个阈值数量。然后呢?

      我同意你可以在控制器中检查它并从那里重定向它,但如果我们要在控制器中进行这些检查,它不会破坏创建专用请求类的目的。

      我觉得控制器应该是干净的,不应该有多个基于验证的退出点。这些小的验证检查可以通过创建新规则或扩展您自己的自定义验证或创建验证后挂钩在请求类本身中处理,所有这些在 Laravel 中都有其独特的用法。

      因此,您可能想要在这里做的是创建一个验证钩子,分配它的地方是检查请求是否为空,就像下面给出的示例一样

      public function withValidator($validator)
          {
              $validator->after(function ($validator) {
                  if (empty($this->toArray())) {
                      $validator->errors()->add('body', 'Request body cannot be empty');
                  }
                   if (!$this->validateCaptcha()) {
                      $validator->errors()->add('g-recaptcha-response', 'invalid');
                  }
      
      
              });
          }
      

      这是它的完整示例。

      <?php
      
      namespace App\Http\Requests\Posts;
      
      
      use App\Helpers\General\Tables;
      use Illuminate\Foundation\Http\FormRequest;
      use Illuminate\Validation\Rule;
      
      class UpdatePostRequest extends FormRequest
      {
          public function authorize()
          {
              return auth()->user()->can('update-post', $this);
          }
      
          public function rules()
          {
              return [
                  'name' => ['string', 'min:3', 'max:255'],
      
                  'email' => ['string', 'email', 'min:3', 'max:255'],
                  'post_data' => ['string', 'min:3',  'max:255'],
              ];
          }
      
          public function withValidator($validator)
          {
              $validator->after(function ($validator) {
                  if (empty($this->toArray())) {
                      $validator->errors()->add('body', 'Request body cannot be empty');
                  }
              });
          }
      
      
      }
      
      

      谢谢..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-13
        • 2017-10-02
        • 2014-03-07
        • 1970-01-01
        • 2016-12-22
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多