laravel - 在 Laravel 中的 FormRequest 上添加其他功能
问题描述
我正在构建一个 Laravel 6 应用程序,并且我关心“最佳实践”。我有一个名为 CustomerController 的控制器。在我的控制器中,我想更新 Customer 模型,所以我将拥有如下功能。
public function update(UpdateCustomer $request, Customer $customer){
//
}
UpdateCustomer 是我的表单请求,我将在其中进行验证。在我的 update() 方法中,我有经典的验证。
public function rules()
{
$validationArray = [];
$validationArray['customer.name'] = 'string|required';
$validationArray['customer.vat'] = 'string|required';
$validationArray['customer.email'] = 'email|required';
return $validationArray;
}
现在我必须做一些除经典之外的特殊验证。假设我的模型中有更多数据,并且我不希望更改这些值。
例如,我有以下内容:address, cap, locality.
我可以验证 UpdateCustomer 请求的第二种方法。
public function validateForDataCantChange()
{
$data = $this->input("customer");
$customer = $this->route("customerID");
$validator = Validator::make([], []); // Empty data and rules fields
$arrayDataThatCantChange = [
'address' => $data['address'] ?? NULL,
'cap' => $data['cap'] ?? NULL,
'locality' => $data['locality'] ?? NULL
];
foreach ($arrayDataThatCantChange as $key => $v) {
if ($customer->{$key} !== $v) {
$validator->errors()->add($key, __("messages.the field :field can't be changed", ['field' => $key]));
}
}
if ($validator->errors()->any()) {
throw new ValidationException($validator);
}
}
然后在我的控制器中,我添加了以下内容。
public function update(UpdateCustomer $request, Customer $customer){
$request->validateForDataCantChange();
}
这是一个不好的做法吗?我应该创建一个新的 FormRequest 吗?在这种情况下(两个表单请求),我如何对单个控制器使用两个不同的请求?
解决方案
对于所需的一点努力,我会亲自创建一个新的表单请求。
如果您希望使用相同的表单请求,您可以执行以下操作:
public function rules()
{
$rules = [
'title' => 'required:unique:posts'
];
// when editing i.e. /posts/2/edit
if ($id = $this->segment(2)) {
$rules['title'] .= ",$id";
}
return $rules;
}
但是,我总是为每个动作使用一个单独的类。
推荐阅读
- python - 如何使用 xpath (Scrapy) 从 dict 获取数据
- java - 在 BST 中找到最常见的元素
- c# - 使用组合框和按钮更改标签
- jenkins - Jenkins管道中美元符号后的非法字符串主体字符
- visual-studio - 在 Visual Studio 中使用(完整)用户路径的 NuGet 依赖项参考链接
- ms-access - 无效的语法无限循环
- influxdb - 将字段转换为标签后,没有查询结果
- node.js - 是否可以使用“instanceof”运算符来识别内置 node.js 错误的子错误类型?
- javascript - 在传输播放时安排 ToneJS 事件
- python - 如何在 Android 上获取 Kivy 应用程序以访问 Internet