在自定义验证规则的消息中包含参数

Including Parameters in Message For Custom Validation Rule

我创建了自定义验证规则:

<?php

namespace App\Rules;

use Carbon\Carbon;
use Illuminate\Contracts\Validation\Rule;

class NotOlderThan
{
    public function validate($attribute, $value, $parameters, $validator)
    {
        $maxAge = $parameters[0];
        $date = Carbon::parse($value);

        return !Carbon::now()->subYears($maxAge)->gte($date);
    }
}

我已将其添加到我的 ServiceProvider 中:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class RulesServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('phone', 'App\Rules\Phone');
        Validator::extend('not_older_than', 'App\Rules\NotOlderThan');
    }
}

我已修改 resources/lan/en/validation.php 以包含以下内容:

/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/

'phone' => 'The :attribute must be a valid :locale number without the country code prefix.',
'not_older_than' => 'Age cannot be older than :maxAge',

现在我可以像这样使用这些自定义验证规则了:

$this->validate([
    'phone' => 'required|phone',
    'dateOfBirth' => 'not_older_than:30',
    'issuedAt' => 'not_older_than:10'
]);

现在我遇到的问题是我希望能够在发送给客户端的验证消息 return 中包含参数,但我不确定在哪里设置它。例如。 'not_older_than' => 'Age cannot be older than :maxAge' 应该 return Age cannot be older than 30 years. 在上面的例子中。

所以第二次看 docs 我看到了我第一次一定错过的以下内容:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Validator::extend(...);

    Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
        return str_replace(...);
    });
}

然而,这对我不起作用,出于某种原因,每当我添加此代码时,自定义验证器都会停止工作,没有错误,它只是不起作用。所以我环顾四周,在这里找到了一个解决方案,建议我改用这种方式尝试:

<?php

namespace App\Rules;

use Carbon\Carbon;
use Illuminate\Contracts\Validation\Rule;

class NotOlderThan
{
    public function validate($attribute, $value, $parameters, $validator)
    {
        $validator->addReplacer('not_older_than',  function ($message, $attribute, $rule, $parameters) {
            return str_replace(':age', $parameters[0], $message);
        });

        $maxAge = $parameters[0];
        $date = Carbon::parse($value);

        return Carbon::now()->subYears($maxAge)->lte($date);
    }
}

在这里,我在自定义规则 class 的验证方法中调用了验证器实例,并在其上使用了 replacer。这对我有用。