【问题标题】:Laravel form request validation on store and update use same validationLaravel 在商店和更新上的表单请求验证使用相同的验证
【发布时间】:2020-08-15 23:22:54
【问题描述】:

我创建 laravel 表单验证请求并对该验证有独特的规则。

我想在 storeupdate 方法上使用它,而无需再次创建新的表单请求验证。

但问题是在store 上,id 不存在并且验证通过 当在update 上时,我没有通过验证,因为 id 存在于存储中

我想忽略 unique 规则中的 id 但使用相同的表单验证请求

如果此操作来自 store 或 update 方法以忽略唯一 ID,则检查表单验证请求类的最佳做法是什么?

【问题讨论】:

  • 您可以检查是否有一个名为_method 的输入,其值为“put”或“patch”,以了解其是否为更新请求
  • 我用的方法跟你一样。不过没问题

标签: laravel validation unique


【解决方案1】:

我正在使用这个

$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'
    ];
}

【讨论】:

    【解决方案2】:

    试试这个,它对我有用。

    Laravel 唯一性:第三个参数可以排除记录的 id 例如,像这样:

    public function rules()
    {
      return [
         'name' => 'required|string|max:255|unique:products,'.$this->id,      
      ];
    }
    

    【讨论】:

      【解决方案3】:

      好的.. 我可以像@porloscerros Ψ 建议的那样做

          public function rules()
          {
              $rules = [
                  'name' => 'required|string|unique:products|max:255',
              ];
      
              if (in_array($this->method(), ['PUT', 'PATCH'])) {
                  $product = $this->route()->parameter('product');
      
                  $rules['name'] = [
                      'required',
                      'string',
                      'max:255',
                      Rule::unique('loan_products')->ignore($product),
                  ];
              }
      
              return $rules;
          }
      

      【讨论】:

      • 像魅力一样工作!!!
      【解决方案4】:

      为什么在 FormRequest 中的 storeupdate 时检查 id?你不需要这个。 id 像参数一样出现在控制器的方法中。或者 laravel 将在控制器的方法 public function update(User $user) 中使用 DI 创建模型,然后您可以像用户模型的实例一样使用 $user。您可以查看 web.php 或 api.php 中的idhttps://laravel.com/docs/7.x/routing#parameters-regular-expression-constraints

      我建议您不要将一个 FormRequest 用于两种方法。这是不好的做法

      【讨论】:

      • 因为我对storeupdate 的规则几乎相同,除了name id 名称不能重复,并且当创建名称为product 1 的新产品时,如果存储中不存在我可以存储它.. 但是当我想编辑时验证失败,因为在存储上重复了name,所以我需要忽略存储上的产品 ID 以通过验证。因此,如果我进行一个表单请求验证,它将很容易维护。
      • 好的。您需要为验证此字段制定新的唯一规则。这里的文档:laravel.com/docs/7.x/validation#rule-unique
      猜你喜欢
      • 2015-06-09
      • 2017-10-23
      • 2016-09-02
      • 2018-06-16
      • 2016-05-23
      • 2016-03-11
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多