验证 Laravel 请求的最佳方式
Best way to validate Laravel Requests
在我的资源控制器中,我有一个存储和一个具有几乎相同验证规则的更新函数。因为我的验证有点复杂,所以我为此创建了一个 Request。
但是因为验证规则有点不同,我必须创建两个个请求:
- 一个存储
- 一个要更新。
但是我在两个不同的地方有几乎相同的数组,如果我决定更改它,我必须编辑两个不同的文件。有更好的方法吗?
我考虑过创建一个额外的请求 class,它有一个包含通用规则的数组和用于存储和更新请求的 classes 继承自此 class 并使用来自基础 class 的数组,用于组合验证规则。
但是添加一个额外的 class 并继承它对我来说似乎有点太多了,只是因为一个或一个规则不同。
我想到的另一种方法是只检查请求中的通用规则 class 并在存储和更新功能中添加额外的验证,但是验证将在两个不同的地方完成,这会使项目更加混乱。
我正在使用 Laravel 版本 5.8
正如@apokryfos所说,没有上下文很难判断,但如果你不想使用继承,你可以验证请求中的请求方法 class 到 add/remove 元素验证数组:
/** YourCustomFormRequest.php */
//
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = ['here', 'goes', 'your', 'common', 'rules'];
if ($this->isMethod('post'))
{
array_merge($rules, ['a', 'specific', 'rule']);
}
if ($this->isMethod('put')) // or 'patch'
{
array_merge($rules, ['another', 'specific', 'rule']);
}
return $rules;
}
//
这背后的逻辑是,当您创建一个对象时,您应该发出一个 POST
请求,但是在更新时您使用 PUT
/PATCH
,所以我们只是从验证数组中获取 add/remove 条件的使用方法。
还没有测试,但应该可以。
PS:为了有更好的代码,你应该考虑解耦代码并创建特定的classes。
您可以检查请求中是否存在指示更新的内容。例如:
public function rules() {
$rules = [];
// these rules apply to both
$rules['title'] = ['required'];
if($this->input('id')) {
// these rules only apply to updates
$rules['something_specific_to_updates'] = ['foo'];
} else {
// these rules only apply to new records
$rules['something_specific_to_new_records'] = ['bar'];
}
return $rules;
}
您还可以查看 $this->route('id')
以查看路由参数的值,而不是表单的 $this->input
POST
数据中的值。
我建议继承:
abstract class BaseRequest extends FormRequest {
public function rules() {
return [ /* common rules */ ];
}
}
class StoreRequest extends BaseRequest {
public function rules() {
return array_merge(parent::rules(), [
/* extra rules including overrides
]);
}
}
您也可以对更新请求执行相同的操作。这创建了一个中心位置来管理请求中的共性。
话虽这么说,但没有实际代码,我们无法真正知道什么最适合您的情况。
$validated = $request->validated();
使用这个:
public function createAccount(RegisterRequest $request)
{
$attr = $request->validated();
而不是:
public function createAccount(Request $request)
{
$attr = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
]);
php artisan make:request RegisterRequest
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
];
}
在我的资源控制器中,我有一个存储和一个具有几乎相同验证规则的更新函数。因为我的验证有点复杂,所以我为此创建了一个 Request。
但是因为验证规则有点不同,我必须创建两个个请求:
- 一个存储
- 一个要更新。
但是我在两个不同的地方有几乎相同的数组,如果我决定更改它,我必须编辑两个不同的文件。有更好的方法吗?
我考虑过创建一个额外的请求 class,它有一个包含通用规则的数组和用于存储和更新请求的 classes 继承自此 class 并使用来自基础 class 的数组,用于组合验证规则。
但是添加一个额外的 class 并继承它对我来说似乎有点太多了,只是因为一个或一个规则不同。
我想到的另一种方法是只检查请求中的通用规则 class 并在存储和更新功能中添加额外的验证,但是验证将在两个不同的地方完成,这会使项目更加混乱。
我正在使用 Laravel 版本 5.8
正如@apokryfos所说,没有上下文很难判断,但如果你不想使用继承,你可以验证请求中的请求方法 class 到 add/remove 元素验证数组:
/** YourCustomFormRequest.php */
//
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = ['here', 'goes', 'your', 'common', 'rules'];
if ($this->isMethod('post'))
{
array_merge($rules, ['a', 'specific', 'rule']);
}
if ($this->isMethod('put')) // or 'patch'
{
array_merge($rules, ['another', 'specific', 'rule']);
}
return $rules;
}
//
这背后的逻辑是,当您创建一个对象时,您应该发出一个 POST
请求,但是在更新时您使用 PUT
/PATCH
,所以我们只是从验证数组中获取 add/remove 条件的使用方法。
还没有测试,但应该可以。
PS:为了有更好的代码,你应该考虑解耦代码并创建特定的classes。
您可以检查请求中是否存在指示更新的内容。例如:
public function rules() {
$rules = [];
// these rules apply to both
$rules['title'] = ['required'];
if($this->input('id')) {
// these rules only apply to updates
$rules['something_specific_to_updates'] = ['foo'];
} else {
// these rules only apply to new records
$rules['something_specific_to_new_records'] = ['bar'];
}
return $rules;
}
您还可以查看 $this->route('id')
以查看路由参数的值,而不是表单的 $this->input
POST
数据中的值。
我建议继承:
abstract class BaseRequest extends FormRequest {
public function rules() {
return [ /* common rules */ ];
}
}
class StoreRequest extends BaseRequest {
public function rules() {
return array_merge(parent::rules(), [
/* extra rules including overrides
]);
}
}
您也可以对更新请求执行相同的操作。这创建了一个中心位置来管理请求中的共性。
话虽这么说,但没有实际代码,我们无法真正知道什么最适合您的情况。
$validated = $request->validated();
使用这个:
public function createAccount(RegisterRequest $request)
{
$attr = $request->validated();
而不是:
public function createAccount(Request $request)
{
$attr = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
]);
php artisan make:request RegisterRequest
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
];
}