我想知道在获取输入值之前是否应该进行表单验证,反之亦然。
我通常首先进行验证,因为我发现尝试访问可能无效的输入值没有任何好处。但是,一位同事最近查看了我的代码,发现它很奇怪。这些步骤是否有正确的顺序?
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');
答案 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 }}