Laravel 动态验证

Laravel dynamic validation

我正在使用 Laravel 并且我有自定义验证。我想将一些值传递给验证 class 并根据数据库对其进行验证,因此我将所有验证逻辑保留在验证 class 中。这是我的代码,但未触发验证错误:

public function rules() {

    $userCode = UserCode::getCode();

    $rules = [
        'name' => 'required|string',
        'email' => 'required|email',

        $userCode => 'unique:user_codes,code,'. $userCode
    ];

    return $rules;
}

我在这里做错了什么?即使值 $userCode 已经存在于数据库中,也永远不会触发验证。例如,如果请求包含错误的电子邮件,则会触发验证。

编辑:我有这个 user_codes table,它有一个必须保持唯一的代码列。 UserCode::getCode() 生成此代码。所以我也想在将它传递给控制器​​之前检查此代码在 table user_codes 中是否唯一。我已经有了自定义验证器,但问题是我希望它也验证此代码。验证器可以与其他请求主体一起正常工作。问题是这段代码不是从请求体传递的,而只是从另一个方法生成的。

你的问题不清楚,我知道你有一个名为 code

的专栏

想要独一无二,可以在请求中添加usercode,

request()->merge(['userCode'=>$userCode]);

然后

$rules = [
        'name' => 'required|string',
        'email' => 'required|email',

        'userCode' => 'unique:user_codes,code,'.UserCode::getId().',id'
    ];

我根据你的问题回答了我的理解

好的,从以下内容开始:

php artisan make:rule SomeAwesomeRule
Then edit that created Rule
class SomeAwesomeRule implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
       //some logic that needs to be handled...
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return __('Some.nice.translated.message');
    }
}

然后应用规则

$rules = [
        'name' => 'required|string',
        'email' => 'required|email',

        'userCode' => new SomeAwesomeRule(#this is a constructor so pass away)

    ];

$rules = [
            'name' => 'required|string',
            'email' => 'required|email',
    
            'userCode' => 'unique:user_codes,code'
        ];

//或

$userCode="";

do{
$userCode = UserCode::getCode();
}
while(UserCode::where('code',$userCode)->first());
// after loop you sure the code is unique
  $rules = [
            'name' => 'required|string',
            'email' => 'required|email',
 
        ];

您可以使用 FormRequest class 和 prepareForValidation() 方法来完成此操作。它应该看起来像这样:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class WhateverRequest extends FormRequest
{
    protected function prepareForValidation(): void
    {
        $this->merge([
            'user_code' => UserCode::getCode(),
        ]);
    }

    public function rules(): array
    {
        return [
            'name' => 'required|string',
            'email' => 'required|email',
            'user_code' => 'unique:user_codes,code'
        ];
    }
}