验证 Laravel 请求的最佳方法
Posted
技术标签:
【中文标题】验证 Laravel 请求的最佳方法【英文标题】:Best way to validate Laravel Requests 【发布时间】:2019-08-06 18:28:29 【问题描述】:在我的资源控制器中,我有一个具有几乎相同验证规则的存储和更新功能。因为我的验证有点复杂,所以我为此创建了一个Request。
但是因为验证规则有点不同,我必须创建两个请求:
一个要存储的 一个要更新。但是我在两个不同的地方有几乎相同的数组,如果我决定更改它,我必须编辑两个不同的文件。有没有更好的方法来做到这一点?
我考虑创建一个额外的 Request 类,它有一个包含通用规则的数组,用于存储和更新 Request 的类继承自该类,并使用基类中的数组来组合验证规则。
但是添加一个额外的类并从它继承对我来说似乎有点太多了,只是因为 one or to 规则不同。
我想到的另一种方法是只检查Request类中的通用规则,并在store和update函数中添加额外的验证,但是验证会在两个不同的地方完成,这会使项目更加混乱.
我使用的是 Laravel 5.8 版
【问题讨论】:
代码将帮助我们确定简单的 OOP 继承是否适合您。可能会,但很难说 代码只是标准的laravel验证,没什么特别的 【参考方案1】:正如@apokryfos 所说,没有上下文很难判断,但如果您不想使用继承,您可以在请求类中验证请求方法以从验证数组中添加/删除元素:
/** 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
,所以我们只是得到使用的方法来添加/删除验证数组中的条件。
尚未对其进行测试,但这应该可以。
PS:为了有更好的代码,应该考虑解耦代码,创建具体的类。
【讨论】:
【参考方案2】:您可以检查请求中是否存在指示更新的内容。例如:
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
数据中的值。
【讨论】:
【参考方案3】:我确实建议继承:
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
]);
您也可以对更新请求执行相同的操作。这将创建一个中心位置来管理请求中的共同点。
如果没有实际代码,我们无法真正知道什么最适合您的情况。
【讨论】:
我认为这是最好的方法。但是 StoreRequest 应该扩展 BaseRequest 而不是 FormRequest。 @no0by5 是的,你是对的,错过了那个细节。谢谢【参考方案4】:$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'
];
【讨论】:
以上是关于验证 Laravel 请求的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
在 laravel 中使用 REST API 的最佳身份验证方法是啥?