Включение параметров в сообщение для пользовательского правила проверки

#laravel #validation #laravel-validation

#laravel #проверка #laravel-проверка

Вопрос:

Я создал пользовательское правило проверки:

 <?php

namespace AppRules;

use CarbonCarbon;
use IlluminateContractsValidationRule;

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

use IlluminateSupportServiceProvider;
use IlluminateSupportFacadesValidator;

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'
]);
  

Теперь проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь возможность включать параметры в сообщение проверки, возвращаемое клиенту, но я не уверен, где это установить. например. 'not_older_than' => 'Age cannot be older than :maxAge' должен вернуться Age cannot be older than 30 years. в приведенном выше примере.

Ответ №1:

Итак, взглянув во второй раз на документы, я увидел следующее, что, должно быть, пропустил в первый раз:

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

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

Однако у меня это не сработало, по какой-то причине всякий раз, когда я добавлял этот код, пользовательский валидатор переставал работать, никаких ошибок, он просто не работал. Итак, я осмотрелся и нашел решение здесь, которое рекомендовало мне попробовать этот способ вместо:

 <?php

namespace AppRules;

use CarbonCarbon;
use IlluminateContractsValidationRule;

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

Здесь я вызываю экземпляр validator в моем методе validate моего пользовательского класса правил и использую replacer для него. У меня это сработало.