Laravel → Кастомные валидаторы в Laravel
Ниже будет описано создание кастомного валидатора, или, если говорить чуть более по-русски, создание пользовательских правил валидации, c фреймворком Laravel 5. Конечно же всё это описано в документации, но мне этого не полностью хватило. С самим ларавелем я работаю всего неделю, так что не исключено, что записи будут ещё. А вот с основным моим в работе фреймворком, Symfony2, в блоге напряжнее, так как почти всё кажется очевидным и писать не о чем :)
Для начала придумаем правило валидации. Или лучше не придумаем, а возьмём из жизни. Плагин jQuery-Mask-Plugin по хитрому форматирует числовые поля (Money по ссылке, если она ещё не устарела), а именно - точка как разделитель тысяч и запятая к дробной части.
Создадим класс с нужным валидатором, правило назовём mask_float:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php
namespace App\Services\Validation;
use Illuminate\Validation\Validator;
class MaskFloatValidator extends Validator {
private $_custom_messages = [
'mask_float' => 'This value is not a valid number',
];
public function __construct($translator, $data, $rules, $messages = [], $attributes = [])
{
parent::__construct($translator, $data, $rules, $messages, $attributes);
$this->setCustomMessages($this->_custom_messages);
}
/**
* @param $attribute
* @param $value
* @return bool
*/
protected function validateMaskFloat($attribute, $value)
{
return (bool)preg_match('/^\d{1,3}(\.\d{3})*(\,\d{2})?$/', $value);
}
}
|
Тут главное не ошибиться с названием метода, т.е. префикс validate и название правила в CamelCase. Потом создаём провайдер самописных валидаторов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php
namespace App\Providers;
use App\Services\Validation\MaskFloatValidator;
use Illuminate\Support\ServiceProvider;
class CustomValidatorServiceProvider extends ServiceProvider {
public function register()
{
}
public function boot()
{
$this->app->validator->resolver(function($translator, $data, $rules, $messages = [], $attributes = [])
{
return new MaskFloatValidator($translator, $data, $rules, $messages, $attributes);
});
}
}
|
И зарегистрируем сам провайдер в приложении:
1 2 3 4 5 6 7 8 9 | <?php
// config/app.php
// ...
'providers' => [
// ...
'App\Providers\CustomValidatorServiceProvider',
];
// ...
|
Готово. Пользуемся :)
Комментарии