среда, 19 июля 2017 г.

LARAVEL. ВАЛИДАЦИЯ ДАННЫХ. ЧАСТЬ 1.

https://laravel.com/docs/5.4/validation

Валидация описана в трейте: \vendor\laravel\framework\src\Illuminate\Foundation\Validation\ValidatesRequests.php

Все правила валидации: https://laravel.com/docs/5.4/validation#available-validation-rules

Идем в \app\Http\Controllers\Admin\ContactController.php

 public function show(Request $request, $id=FALSE) {
        // Если запрос - метод post, то валидируем данные:
        if($request->isMethod('post')) {
            // В request содержатся имена полей: name, email, site, text.
            // $rules - это правила валидации.
            /* 
            required - обязательное к заполнению
            max - максимум 10 символов
            email - проверка на соотвествие адреса электронной почте
            */
            $rules = [
                'name' => 'required|max:10',
                'email' => 'required|email',
            ];
            
            $this->validate($request, $rules);
            
            // код
            dump($request->all());
            /*
            Идет распечатка данных:
            array:5 [▼
              "_token" => "HJz9juSlhJnDwrprrlZcyvxoOxu7yWzC1AHkZ1SO"
              "name" => "Anna"
              "email" => "anna@mail.ru"
              "site" => "anna.ru"
              "text" => "Hello!"
            ]
            */
        }
        
        return view('default.contact', ['title'=>'Contacts']);
    }

Сообщения об ошибках валидации сохраняются в переменную errors и записываются в сессию. Эту переменную нужно сделать  доступной в шаблоне.
Для этого в \app\Http\Kernel.php есть посредник ShareErrorsFromSession.
Переместим его в массив middleware. Иначе ошибки не будут отображаться!!!!

 protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class
       
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
           // \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
           // \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

Идем в \resources\views\default\contact.blade.php и отобразим вывод ошибки:

Доступные правила валидации.

accepted
Поле должно быть в значении yes, on, 1 или true. Это полезно для проверки принятия правил и лицензий.

active_url
Поле должно иметь корректную запись A или AAAA согласно PHP-функции dns_get_record.
Поле должно быть корректным URL согласно PHP-функции checkdnsrr.

after:date
Поле должно быть датой, более поздней, чем date. Строки приводятся к датам функцией strtotime:
'start_date' => 'required|date|after:tomorrow'

alpha
Поле должно содержать только латинские символы.

alpha_dash
Поле должно содержать только латинские символы, цифры, знаки подчёркивания (_) и дефисы (-).

alpha_num
Поле должно содержать только латинские символы и цифры.

array
Поле должно быть PHP-массивом (тип array). 

before:date
Поле должно быть датой, более ранней, чем date. Строки приводятся к датам функцией strtotime. 

between:min,max
Поле должно быть числом в диапазоне от min до max. Строки, числа и файлы трактуются аналогично правилу size.

boolean
Поле должно соответствовать логическому типу. Доступные значения: true, false, 1, 0, "1" и "0".

confirmed
Значение поля должно соответствовать значению поля с этим именем, плюс _confirmation. 
Например, если проверяется поле password, то на вход должно быть передано совпадающее по значению поле password_confirmation.

date
Поле должно быть правильной датой в соответствии с PHP-функцией strtotime. 

different:field
Значение проверяемого поля должно отличаться от значения поля field. 

digits:value
Поле должно быть числовым и иметь длину, равную value. 

digits_between:min,max
Поле должно иметь длину в диапазоне между min и max. 

email
Поле должно быть корректным адресом e-mail.

exists:table,column
Поле должно существовать в заданной таблице базы данных. 

in:foo,bar,...
Значение поля должно быть одним из перечисленных (foo, bar и т.д.).

integer
Поле должно иметь корректное целочисленное значение.

ip
Поле должно быть корректным IP-адресом.

json
Поле должно быть JSON-строкой. 

max:value
Значение поля должно быть меньше или равно value. 

min:value
Значение поля должно быть более или равно value. 

not_in:foo,bar,...
Значение поля не должно быть одним из перечисленных (foo, bar и т.д.).

numeric
Поле должно иметь корректное числовое или дробное значение. 

regex:pattern
Поле должно соответствовать заданному регулярному выражению.

required
Проверяемое поле должно иметь непустое значение. 

required_if:anotherfield,value,...
Проверяемое поле должно иметь непустое значение, если другое поле anotherfield имеет любое значение value.

https://laravel.ru/docs/v5/validation#accepted

same:field
Поле должно иметь то же значение, что и поле field.

size:value
Поле должно иметь совпадающий с value размер. Для строк это обозначает длину, для чисел — число, для массивов — число элементов массива, для файлов — размер в килобайтах.

string
Поле должно быть строкового типа. 

timezone
Поле должно содержать корректный идентификатор временной зоны в соответствии с PHP-функцией timezone_identifiers_list.

unique:table,column,except,idColumn
Значение поля должно быть уникальным в заданной таблице базы данных. Если column не указано, то будет использовано имя поля.

Ответ на вопрос по валидации необязательных полей.
На stackoverflow.com была затронута подобная тема. Вопрос назывался Laravel do not validate if field is not required.
Ответ был следующим: "...если вы хотите также разрешить нулевые или пустые значения (при условии, что поле не требуется), вы можете добавить правило nullable".

Если следовать документации, то там рассказывается о дополнительных полях. 

По умолчанию в Laravel включены глобальные посредники TrimStrings и ConvertEmptyStringsToNull. Они перечислены в свойстве $middleware класса App\Http\Kernel. Из-за этого нужно часто помечать дополнительные поля как nullable, если не нужно, чтобы валидатор считал не действительным значение null. Например:

$this->validate($request, [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    'publish_at' => 'nullable|date',
]);

В этом примере мы указываем что поле publish_at может быть null или должно содержать дату. Если модификатор nullable не добавляется в правило, проверяющий элемент будет рассматривать null как недопустимую дату.

Ссылка на русский перевод: http://laravel.su/docs/5.4/validation#validation-quickstart

2 комментария:

  1. Здравствуйте.
    Спасибо за примеры и объяснения.
    Есть ли возможность, попросить Laravel валидировать не обязательные поля?
    Н-р:
    public function rules()
    {
    return [
    'name' => 'required|alpha_dash|max:100',
    'price' => 'required|numeric|between:0.01,999999.99',
    'price_old' => 'numeric|between:0.01,999999.99',
    'shipping_costs' => 'numeric|between:0.01,999999.99',
    ];
    }
    price_old & shipping_costs поля не обязательные для ввода, но если таки данные будут, хотелось бы их тоже провалидировать ))
    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте, Павел! Посмотрите ответ на ваш вопрос, выделенный синим на странице, т.к здесь код не размещается, к сожалению.

      Удалить

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html