Laravel 在商店和更新上的表单请求验证使用相同的验证

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

您可以检查是否有一个名为_method 的输入,其值为“put”或“patch”,以了解其是否为更新请求 我用的方法跟你一样。不过没问题 【参考方案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 中的id: https://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

以上是关于Laravel 在商店和更新上的表单请求验证使用相同的验证的主要内容,如果未能解决你的问题,请参考以下文章

laravel 的 表单请求

Laravel 5表单请求验证返回禁止错误

laravel :在验证之前清理请求数据

Laravel 5 表单请求数据预操作

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则

如何对 laravel 表单请求提出条件