Laravel → Кастомные валидаторы в Laravel
Ниже будет описано создание кастомного валидатора, или, если говорить чуть более по-русски, создание пользовательских правил валидации, c фреймворком Laravel 5. Конечно же всё это описано в документации, но мне этого не полностью хватило. С самим ларавелем я работаю всего неделю, так что не исключено, что записи будут ещё. А вот с основным моим в работе фреймворком, Symfony2, в блоге напряжнее, так как почти всё кажется очевидным и писать не о чем :)
Для начала придумаем правило валидации. Или лучше не придумаем, а возьмём из жизни. Плагин jQuery-Mask-Plugin по хитрому форматирует числовые поля (Money по ссылке, если она ещё не устарела), а именно - точка как разделитель тысяч и запятая к дробной части.
Создадим класс с нужным валидатором, правило назовём mask_float:
<?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. Потом создаём провайдер самописных валидаторов:
<?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); }); } }
И зарегистрируем сам провайдер в приложении:
// config/app.php // ... 'providers' => [ // ... 'App\Providers\CustomValidatorServiceProvider', ]; // ...
Готово. Пользуемся :)
Комментарии