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

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

Комментарии

avatar
Jerronimo
avatar
В ларке для валидации данных еще как вариант есть police https://laravel.com/docs/5.1/authorization#policies
ответить
avatar
morontt
avatar
Тут я с тобой не соглашусь. Police относится не к валидации данных, как таковой, а к правам или правилам доступа к объектам.
ответить
2 комментария Написать что-нибудь
Адрес электронной почты нигде не отображается, необходим только для обратной связи.