Хорошо, у меня здесь очень сложная ситуация, и я думаю, что либо мне не хватает чего-то важного, что уже присутствует, либо Laravel не предоставляет способа достичь этого на данный момент. Я хотел бы указать настраиваемое сообщение об ошибке проверки с настраиваемым заполнителем, который я хотел бы заменить в сообщении. Проблема с этим: я использую правило проверки regex
, о котором документация Laravel явно указывает, что его лучше передавать в массиве, чтобы избежать нежелательного поведения разделителя. Ситуация следующая: я хотел бы указать глобальное многоязычное сообщение для проверки name.regex
, что я и сделал:
'custom' => [
'name' => [
'regex' => 'The :attribute must corespond to the given format: :format!'
]
]
Как видите, я поместил в это сообщение собственный заполнитель :format
, потому что для атрибута name
разных классов я собираюсь сопоставить разные регулярные выражения. Поэтому я хотел бы иметь возможность вводить настраиваемое удобочитаемое описание каждого заданного регулярного выражения во время проверки (в качестве параметра). Итак, я делаю в своем контроллере следующее:
$input = Input::all();
$validator = Validator::make($input, [
'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u']
]);
У меня также есть Validator::replacer()
метод в моем AppServiceProvider.php
, который должен заменить заполнитель :format
в сообщении:
Validator::replacer('regex', function($message, $attr, $rule, $parameters){
return str_replace(':format', "I would like to be able to somehow retrieve the custom format description here, but using \$parameters[] is not an option", $message);
});
Проблема с правилом проверки regex
заключается в том, что мне действительно не разрешено передавать ему параметр в валидаторе, например, так:
$validator = Validator::make($input, [
'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u,Thats my custom validator format description']
]);
потому что это полностью портит регулярное выражение (что и должно быть). Поэтому я не могу использовать $ parameters 1 $ в моем replacer()
для замены заполнитель. Кроме того, было бы действительно неудобно передавать целое предложение в качестве параметра правила проверки, разделенного запятыми. Так что эта концепция не соответствует потребностям.
Значение :format
будет динамическим и будет сильно различаться в зависимости от требований name
полей разных классов, поэтому мне действительно нужно, чтобы это динамическое многоязычное описание было установлено как свойство текущего экземпляра валидатора. Я подумал, что, может быть, наиболее удобным сценарием будет что-то вроде этого:
$validator = Validator::make($input, [
'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u', 'format:Current name requirements described here.']
]);
и Laravel каким-то образом знает, что :format
следует заменить текущим правилом где-нибудь в сообщениях этого экземпляра. Я думал о том, чтобы явно добавить этот дополнительный параметр в качестве правила проверки, а затем управлять им, но я действительно не могу добиться соединения между правилами (другими словами, получить параметр нового правила format
и использовать его в regex
правило). Я действительно не знаю, как подойти к этой проблеме, и любая помощь будет принята с благодарностью. Заранее спасибо!
P.S. Я знаю, что могу каждый раз указывать все сообщение следующим образом:
$input = Input::all();
$validator = Validator::make($input, [
'name' => ['required', 'regex:/^\p{Lu}\p{L}+ \p{Lu}\p{L}+$/u']
],
[
'name.regex' => 'My custom message here'
]);
но я не хочу вводить все сообщение каждый раз, потому что позже оно может содержать другие заполнители (которые могут быть глобальными или около того), и я хочу использовать многоязычное базовое сообщение, предоставленное через файлы validator.php
, поэтому Мне действительно нужно заменить только :format
.