Валидация в Laravel с примерами

Валидация в Laravel с примерами
Валидация в Laravel с примерами

Оглавление:

Сегодняшняя тема – это инструкция по валидации в Laravel с примерами. Laravel фреймворк предоставляет множество различных способов валидации данных Вашего приложения. По умолчанию базовый контроллер Laravel использует трейт ValidateRequests, который обеспечивает удобный способ валидации входящего HTTP-запроса с помощью множества правил валидации.

Мы можем использовать валидацию в Laravel по-разному: либо внутри метода контроллера, либо с помощью класса FormRequest для валидации входящих запросов. В этом уроке мы рассмотрим все способы валидации в Laravel.

Валидация формы в Laravel

Первый шаг – установите последнею версию Laravel с помощью следующей команды.

Используемая версия Laravel на момент написания статьи 5.8.
        composer create-project --prefer-dist laravel/laravel blog
    

Перейдите в папку проекта и откройте его в вашем IDE или редакторе кода.

Теперь создайте базу данных MySQL, а также подключите её к Laravel. Укажите данные для подключения к базе данных в файле .env.

        DB_CONNECTION=mysql
        DB_HOST=127.0.0.1
        DB_PORT=3306
        DB_DATABASE=blog
        DB_USERNAME=root
        DB_PASSWORD=root
    

Создайте файл FormController.php, используя следующую команду.

        php artisan make:controller FormController
    

Создайте два метода внутри файла FormController.php.

        <?php

        // FormController.php

        namespace App\Http\Controllers;

        use Illuminate\Http\Request;

        class FormController extends Controller
        {
            public function create()
            {

            }

            public function store(Request $request)
            {
                
            }
        }

    

Теперь напишите два маршрута в файле routes/web.php.

        // web.php
        Route::get('form', 'FormController@create')->name('form.create');
        Route::post('form', 'FormController@store')->name('form.store');
    

Создайте модель и файл миграции, используя следующую команду.

        php artisan make:model Form -m
    

Напишите следующий код в файле миграции [timestamp] _create_forms_table.php, который находится в папке database/migrations.

        // create_forms_table.php

        public function up()
        {
                Schema::create('forms', function (Blueprint $table) {
                    $table->bigIncrements('id');
                    $table->string('item_name');
                    $table->string('sku_no');
                    $table->integer('price');
                    $table->timestamps();
                });
        }

    

Теперь, для того чтобы создать таблицу, запустите миграции командой:

        php artisan migrate
    

Также, чтобы предотвратить исключение массового присвоения, добавьте свойство $fillable, внутри модели Form.

    <?php

        // Form.php

        namespace App;

        use Illuminate\Database\Eloquent\Model;

        class Form extends Model
        {
            protected $fillable = ['item_name', 'sku_no', 'price'];
        }

    

Внутри папки resources/views, создайте файл layout.blade.php и добавьте в него следующий код.

        <!DOCTYPE html>
        <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Laravel Form Validation Example Tutorial</title>
          <link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css" />
        </head>
        <body>

          <div class="container">
            @yield('content')
          </div>
          
          <script src="{{ asset('js/app.js') }}" type="text/js"></script>

        </body>
        </html>
    

Теперь в той же папке resources/views создайте файл с именем create.blade.php и добавьте в него следующий код.

        

        @extends('layout')

        @section('content')
        <style>
          .uper {
            margin-top: 40px;
          }
        </style>
        <div class="card uper">
          <div class="card-header">
            Add Item
          </div>
          <div class="card-body">
            @if ($errors->any())
              <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                      <li>{{ $error }}</li>
                    @endforeach
                </ul>
              </div><br />
            @endif
              <form method="post" action="{{ route('form.store') }}">
                  <div class="form-group">
                      @csrf
                      <label for="name">Item Name:</label>
                      <input type="text" class="form-control" name="item_name"/>
                  </div>
                  <div class="form-group">
                      <label for="price">SKU Number :</label>
                      <input type="text" class="form-control" name="sku_no"/>
                  </div>
                  <div class="form-group">
                      <label for="quantity">Item Price :</label>
                      <input type="text" class="form-control" name="price"/>
                  </div>
                  <button type="submit" class="btn btn-primary">Create Item</button>
              </form>
          </div>
        </div>
        @endsection
    

Теперь, внутри контроллера FormController.php напишите функцию create().

        // FormController.php

        public function create()
        {
            return view('create');
        }

    

Запускаем команду:

        php artisan serve
    

И теперь Вы можете получить доступ к форме по этому адресу: http://localhost:8000/form .

Создание формы на Laravel
Рис 1. Форма для добавления товара

Написание логики валидации

Теперь мы можем написать логику валидации внутри функции store() из контроллера FormController.

        // FormController.php

        public function store(Request $request)
        {
                $validatedData = $request->validate([
                    'item_name' => 'required|max:255',
                    'sku_no' => 'required|alpha_num',
                    'price' => 'required|numeric',
                ]);
                \App\Form::create($validatedData);

                return response()->json('Данные сохранены успешно');
        }
    

Как видите, мы передали нужные правила валидации в метод validate(). Если валидация не пройдена, то ошибка сгенерируется автоматически. Если валидация пройдена, наш контроллер продолжит работу и сохранит данные в базе данных, и мы получим ответ в формате json.

Если мы отправим форму с пустыми полями, то мы в ответ получим ошибки.

Вывод ошибок валидации в Laravel
Рис 2. Вывод ошибок на экран

Остановка после первой неудачной проверки

Иногда может потребоваться остановить выполнение правил после первой неудачной проверки. Для этого, в правилах валидации, назначьте атрибут bail.

        // FormController.php

        $validatedData = $request->validate([
              'item_name' => 'bail|required|max:255',
              'sku_no' => 'required|alpha_num',
              'price' => 'required|numeric',
         ]);

    

Отображение ошибок валидации

Laravel автоматически перенаправляет пользователя на предыдущую страницу. Кроме того, все ошибки валидации будут автоматически перенесены во флеш-переменные сессии.

Обратите внимание, что нам не нужно специально привязывать сообщения об ошибках к шаблону в нашем маршруте GET. Это потому, что Laravel будет проверять наличие ошибок в данных сессий и автоматически привязывать их к шаблону, если они доступны.

В представлении, ошибки из сессий, доступны через переменную $errors.

Проверяем, существуют ли ошибки в сессии, и выводим их на экран. Данный код добавляем внутри файла create.blade.php, в том месте где хотим, чтобы отображались ошибки.

        @if ($errors->any())
              <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                      <li>{{ $error }}</li>
                    @endforeach
                </ul>
              </div><br />
        @endif
    

Валидация через Form Request в Laravel

В приведенном выше примере мы написали правила валидации внутри контроллера. Но, мы также можем создать отдельный файл для написания правил валидации.

Для более сложных сценариев валидации Вы можете создать так называемые form requests. Form requests – это специальные классы, которые содержат логику валидации. Для создания класса form request, используйте Artisan-команду make: request.

        php artisan make:request FieldRequest
    

В папке app/Http/Requests будет создан файл с именем FieldRequest.php.

Давайте добавим несколько правил валидации в методе rules().

        // FieldRequest.php

        public function rules()
        {
            return [
                 'item_name' => 'bail|required|max:255',
                 'sku_no' => 'required|alpha_num',
                 'price' => 'required|numeric',
            ];
        }

    

Если Вы планируете использовать логику авторизации в другом месте Вашего приложения, верните true из метода authorize().

        // FieldRequest.php

        public function authorize()
        {
            return true;
        }

    

Итак, теперь Вам не нужно переписывать эти правила внутри метода store(), из контроллера FormController.php.

Вам необходимо импортировать пространство имен FieldRequest в файл FormController.php и передать FieldRequest в качестве инъекцию зависимости внутри функции store().

        <?php

        // FormController.php

        namespace App\Http\Controllers;

        use Illuminate\Http\Request;
        use App\Http\Requests\FieldRequest;

        class FormController extends Controller
        {
            public function create()
            {
                return view('create');
            }

            public function store(FieldRequest $request)
            {
                $validatedData = $request->validated();
                \App\Form::create($validatedData);

                return response()->json('Form is successfully validated and data has been saved');
            }
        }

    

Если валидация не пройдена, будет сгенерирован ответ на переадресацию, чтобы вернуть пользователя на предыдущую страницу. Сообщения об ошибках будут сохранены в флеш-переменных сессии, таким образом делая их доступными для отображения.

Настройка сообщений об ошибках

Вы можете настроить сообщения об ошибках, используемые form request, с помощью метода messages. Этот метод должен возвращать массив пар атрибутов / правил и соответствующие сообщения об ошибках.


        // FieldRequest.php 

          /**
           * Get the error messages for the defined validation rules.
           *
           * @return array
           */
            public function messages()
            {
                return [
                    'item_name.required' => 'An Item Name is required',
                    'sku_no.required'  => 'An SKU NO is required',
                    'price.required'  => 'The price is required',
                ];
            }

    

Сохраните файл и снова отправьте форму без каких-либо значений, и Вы увидите эти сообщения об ошибках вместо используемых по умолчанию.

Изменение стандартных ошибок валидации в laravel
Рис 3. Изменен стандартный текст ошибок валидации

Создание валидаторов вручную

Если Вы не хотите использовать метод validate(), то Вы можете создать экземпляр валидатора вручную с помощью фасада Validator. Метод make() создает новый экземпляр валидатора.

        // FormController.php

        use Validator;

        public function store(Request $request)
        {
            $validatedData = Validator::make($request->all(), [
                'item_name' => 'bail|required|max:255',
                'sku_no' => 'required|alpha_num',
                'price' => 'required|numeric',
            ])->validate();

             \App\Form::create($validatedData);

             return response()->json('Form is successfully validated and data has been saved');
        }

    

Это даст нам тот же результат. Если Вы хотите создать экземпляр валидатора вручную, но в то же время воспользоваться автоматической переадресацией, Вы можете вызвать метод validate() в существующем экземпляре валидатора.

Для дополнительной информации о валидации, смотрите официальную документацию к Laravel.

На этом все, статья по валидации в Laravel 5.8 с примерами завершена.

Источник: Laravel Validation Example | Laravel Form Validation

Понравилась статья?

Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.

Поделиться с друзьями:

Подписаться на новые статьи:

Delivered by FeedBurner

Поддержите пожалуйста мой проект!

Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu1607@gmail.com. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.

Добавляйтесь ко мне в друзья в:

Добавляйтесь в мои группы:

Подпишитесь на мои каналы:

Автор статьи: Мунтян Сергей

Копирование материалов с сайта sozdatisite.ru ЗАПРЕЩЕНО!!!

Дата добавления: 2020-01-30 19:27:01