在我的资源控制器中,我具有一个具有几乎相同的验证规则的存储和更新功能。因为验证有点复杂,所以我为此创建了一个Request。
但是由于验证规则略有不同,因此我必须创建两个请求:
但是,所以我在两个不同的地方拥有几乎相同的数组,如果决定更改它,则必须编辑两个不同的文件。有更好的方法吗?
我考虑过创建一个额外的Request类,该类具有一个包含通用规则的数组,并且存储和更新Request的类都从该类继承,并使用基类中的数组来组合验证规则。
但是添加一个额外的类并从中继承对我来说似乎有点太多,因为一个或规则不同。
我想到的另一种方法是只检查Request类中的通用规则,并在store和update函数中添加额外的验证,但是验证将在两个不同的地方完成,这会使项目更加混乱
我正在使用Laravel 5.8版
答案 0 :(得分:3)
正如@apokryfos所说,没有上下文很难说,但是如果您不想使用继承,则可以在request类中验证request方法以从验证数组中添加/删除元素:
/** 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:为了获得更好的代码,您应该考虑将代码解耦并创建特定的类。
答案 1 :(得分:2)
我建议继承:
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
]);
}
}
您也可以对更新请求执行相同的操作。这将创建一个中心位置来管理请求中的共性。
这就是说,没有实际的代码,我们无法真正知道最适合您的情况。
答案 2 :(得分:1)
您可以检查请求中是否存在指示更新的内容。例如:
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
数据中的值。