在Laravel 5中,After Validation Hook有什么用途?

7

我正在学习Laravel 5,尝试验证数据库中是否存在电子邮件,如果失败则添加自定义消息。 我在Laravel文档中找到了“验证后钩子”。

$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

它仍然输出相同的结果。何时应该使用第一个来验证某些内容而不是第二个呢?
3个回答

6
第一种方法的重点在于将所有内容都包含在Validator对象内,使其更具可重用性。
是的,在您的情况下,它确实执行了完全相同的功能。但想象一下,如果您想要验证多个项目会怎样。
foreach ($inputs as $input) {
    $validator->setData($input);

    if ($validator->fails()) { ... }
}

在你的情况下,你将不得不将那个“if”检查添加到循环中。现在想象一下,在许多不同的地方运行此验证(多个控制器,也许是控制台脚本)。现在你有了这个if语句在3个不同的文件中,下次你去修改它时,你需要进行3倍的工作量,也许你会忘记在某个地方更改它...
我想不出很多用例,但这就是它背后的基本思想。
顺便说一下,有一个名为“exists”的验证规则,可能会处理你的“emailExist()”方法。
$rules = [
    'email' => 'exists:users,email',
];

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


谢谢。它运行得很好,exists规则确实非常有用,节省了很多时间。 - Sy Tran

4

passedValidation方法将在FormRequest类中的验证成功后触发。实际上,这个方法是afterValidation方法的更名。

因此,你可以这样做:

class RegistrationRequest extends FormRequest
{

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

4

有很多情况下你可能觉得这是必需的。

比如,假设你正在为一个项目构建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');
            }


        });
    }

以下是完整的IT技术示例:

<?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');
            }
        });
    }


}

谢谢..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接