【问题标题】:Put other function on FormRequest in Laravel在 Laravel 中的 FormRequest 上添加其他功能
【发布时间】:2019-09-05 07:12:34
【问题描述】:

我正在构建一个 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 吗?在这种情况下(两个表单请求),我如何对单个控制器使用两个不同的请求?

【问题讨论】:

  • 您能不能只禁用表单中不应更改的字段而不在您的update 方法中更新它们?对我来说似乎很奇怪,您允许编辑表单中的字段,然后告诉用户他不能更改它。
  • 是的,这只是示例,可能在前端将被禁用,但用于指定我是否有不同的和验证其他经典值。 :) 知道表单中的请求是否应该是 rules() 函数或者可能是其他函数,如果进行第二次验证是一种不好的做法。
  • 因为,例如,只有在我的设置中设置为进行此验证时,我才能进行此验证
  • 在您的示例中,我会将所有内容添加到 UpdateCustomer rules 方法中,以便更新客户的所有验证都在一个地方,并且您不必在验证后调用第二种验证方法.然后,我会将您的自定义代码替换为 in 验证规则,以检查值是否未更改。 仅当我的设置中设置为进行此验证时,不太确定您的意思,但您可以检查您的设置,然后将这些验证规则添加到 $validationArray 数组中。

标签: laravel laravel-6


【解决方案1】:

我会亲自创建一个新的表单请求。

如果您希望使用相同的表单请求,您可以执行以下操作:

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;
}

但是,我总是为每个动作使用一个单独的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多