morontt.info

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',
    ];
// ...

Готово. Пользуемся :)

g-plus-icon
comments powered by Disqus
Учтите, что комментарии добавляются только при включённом JavaScript в браузере. В ином случае информация хоть и не пропадёт бесследно, но будет отправлена в спам и вряд ли хоть кто-нибудь её увидит.
Jerronimo
avatar
В ларке для валидации данных еще как вариант есть police https://laravel.com/docs/5.1/authorization#policies
Ответить
morontt
avatar
Тут я с тобой не соглашусь. Police относится не к валидации данных, как таковой, а к правам или правилам доступа к объектам.
Ответить
2 комментария Написать что-нибудь
Поля, помеченные asterisk, обязательны для заполнения.
Адрес электронной почты нигде не отображается, необходим только для обратной связи.
Веб-сайт вводите в формате http://example.org, при желании, конечно.