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

Оглавление:
Сегодняшняя тема – это инструкция по валидации в Laravel с примерами. Laravel фреймворк предоставляет множество различных способов валидации данных Вашего приложения. По умолчанию базовый контроллер Laravel использует трейт ValidateRequests, который обеспечивает удобный способ валидации входящего HTTP-запроса с помощью множества правил валидации.
Мы можем использовать валидацию в Laravel по-разному: либо внутри метода контроллера, либо с помощью класса FormRequest для валидации входящих запросов. В этом уроке мы рассмотрим все способы валидации в Laravel.
Валидация формы в Laravel
Первый шаг – установите последнею версию Laravel с помощью следующей команды.
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 .
Написание логики валидации
Теперь мы можем написать логику валидации внутри функции 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.
Если мы отправим форму с пустыми полями, то мы в ответ получим ошибки.
Остановка после первой неудачной проверки
Иногда может потребоваться остановить выполнение правил после первой неудачной проверки. Для этого, в правилах валидации, назначьте атрибут 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', ]; }
Сохраните файл и снова отправьте форму без каких-либо значений, и Вы увидите эти сообщения об ошибках вместо используемых по умолчанию.
Создание валидаторов вручную
Если Вы не хотите использовать метод 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
Понравилась статья?
Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.
Поделиться с друзьями:
Подписаться на новые статьи:
Поддержите пожалуйста мой проект!
Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu1607@gmail.com. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.
Добавляйтесь ко мне в друзья в:
Добавляйтесь в мои группы:
Подпишитесь на мои каналы:
Автор статьи: Мунтян Сергей
Копирование материалов с сайта sozdatisite.ru ЗАПРЕЩЕНО!!!
Дата добавления: %date%