表单验证和检索输入值的正确顺序是什么?

时间:2019-02-12 19:29:39

标签: laravel validation

我想知道在获取输入值之前是否应该进行表单验证,反之亦然。

我通常首先进行验证,因为我发现尝试访问可能无效的输入值没有任何好处。但是,一位同事最近查看了我的代码,发现它很奇怪。这些步骤是否有正确的顺序?

public function createGroups(Request $request)
{
    $this->validate($request, [
        'courses' => 'required_without:sections',
        'sections' => 'required_without:courses',
        'group_set_name' => 'required',
        'group_number' => 'required|integer|min:1'
    ]);

    $courses = $request->input('courses');
    $sections = $request->input('sections');
    $group_set_name = $request->input('group_set_name');
    $group_number = $request->input('group_number');

3 个答案:

答案 0 :(得分:2)

由于定义了required个参数,因此在方法开始时将控制器逻辑的验证位置定位为 即可。如果收到的数据不能完全满足要求,则会向用户产生验证错误。这遵循了富有成效的“快速失败”思路:https://en.wikipedia.org/wiki/Fail-fast

同样重要的是,您不要使用任何未通过验证的严格要求的数据。验证失败的数据不再受信任。除非有其他原因,例如需要记录来自前端的所有传入数据,否则这里的顺序对我来说很好。

答案 1 :(得分:2)

我完全同意@1000Nettles的回答,详细说明他/她的答案(应该被接受的答案):当数据消失时,无需继续您的业务逻辑不符合您的规格。假设您期望的字符串长度为N个字符,因为您使用该限制定义了数据库(为了优化db设计),即使它会引发异常,您是否也会尝试将其持久化?不是。

此外,Laravel有一种提取验证类的特殊方法:Form Request。这被注入到控制器中。当呼叫到达控制器时,表示已经通过验证,如果未通过验证,则返回422错误。

答案 2 :(得分:1)

创建一个自定义请求,将混乱的信息排除在您的控制器之外,如果验证失败,它甚至不会影响您的控制器功能,并且如果通过验证,就可以在控制器中获取数据。

php artisan make:request GroupRequest

app/Http/Requests/GroupRequest.php中:

public function authorize()
{
    // return true;
    return request()->user()-isAdmin; // <-- example, but true if anyone can use this form
}

public function rules()
{
    return [
        'courses'        => ['required_without:sections'],
        'sections'       => ['required_without:courses'],
        'group_set_name' => ['required'],
        'group_number'   => ['required', 'integer', 'min:1'],
    ];
}

最好的部分是,您甚至可以在验证后在此处(GroupRequest.php)中处理数据:

public function validated()
{
    $validated = $this->getValidatorInstance()->validate();

    // EXAMPLE: hash password here then just use new hashed password in controller
    $validated['password'] = Hash::make($validated['password']);

    return $validated;
}

在您的控制器中:

public function createUser(UserRequest $request) // <- in your case 'GroupRequest'
{
    $validated = $request->validated(); // <-- already passed validation

    $new_user = User::create($validated); // <-- password already hashed in $validated

    return view('dashboard.users.show')->with(compact('user'));
}

就您而言,如果您使用上面的GroupRequest块,则可以返回1行代码来查看:

public function createGroups(GroupRequest $request)
{
    return view('example.groups.show')->with($request->validated()); // <-- already an array
}

然后在刀片视图文件中,可以使用变量{{ $group_set_name }}{{ $group_number }}