4. Контроллеры и валидация

https://itproger.com/course/laravel/4

Из корня нашего проекта в терминале прописываем команду:

php artisan make:controller ContactController

Должно вернуть: Controller created successfully.

Эта команда создала контроллер app/Http/Controllers/ContactController.php

Создадим функцию в этом файле:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ContactController extends Controller
{
    public function submit() {
        return "Okey";
    }
}

Обратимся к этой функции при загрузке страницы /contact. Для этого в route/web.php изменим роут для ‘/contact/submit’:

Route::post('/contact/submit', 'ContactController@submit')->name('contact-form');

Должно выводится «Okey».

Получение данных из формы и вывод их на экран

Данные из формы приходят в формате класса Request. Его мы должны получить в функции submit . Запишем это выведем данные из формы на экран, с помощью функции dd:

public function submit(Request $req) {
        dd($req);
}

Должно получиться такое:

Illuminate\Http\Request {#43 ▼
  #json: null
  #convertedFiles: null
  #userResolver: Closure($guard = null) {#217 ▶}
  #routeResolver: Closure() {#226 ▶}
  +attributes: Symfony\Component\HttpFoundation\ParameterBag {#45 ▶}
  +request: Symfony\Component\HttpFoundation\ParameterBag {#44 ▶}
  +query: Symfony\Component\HttpFoundation\InputBag {#51 ▶}
  +server: Symfony\Component\HttpFoundation\ServerBag {#47 ▶}
  +files: Symfony\Component\HttpFoundation\FileBag {#48 ▶}
  +cookies: Symfony\Component\HttpFoundation\InputBag {#46 ▶}
  +headers: Symfony\Component\HttpFoundation\HeaderBag {#49 ▶}
  #content: null
  #languages: null
  #charsets: null
  #encodings: null
  #acceptableContentTypes: null
  #pathInfo: "/contact/submit"
  #requestUri: "/contact/submit"
  #baseUrl: ""
  #basePath: null
  #method: "POST"
  #format: null
  #session: Illuminate\Session\Store {#251 ▶}
  #locale: null
  #defaultLocale: "en"
  -preferredFormat: null
  -isHostValid: true
  -isForwardedValid: true
  -isSafeContentPreferred: null
  basePath: ""
  format: "html"
}

Здесь много разных данных. Данные из формы находятся в request/parameters . Обратиться к ним можно с помощью метода input:

dd($req->input('subject'));

Валидация данных

Для валидации пропишем в ContactController в функции submit следующее:

$validation = $req->validate([
            'subject' => 'required|min:5|max:50',
            'message' => 'required|min:15|max:500'
]);

Все параметры валидации находятся здесь: https://laravel.com/docs/7.x/validation , в конце страницы.

Ошибки валидации

Для вывода ошибок валидации существует объект $errors. К нему можно обратиться из любого файла.

В файле contact.blade.php запишем:

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

Сейчас выводятся стандартные сообщения о ошибках, если ошибки существуют.

Валидация в отдельном файле

Создадим файл для валидации в консоли:

php artisan make:request ContactRequest

Должен создастся файл App\Http\Requests\ContactRequest .

Добавим возможность использования этого класса в наш контроллер app/Http/Controllers/ContactController.php :

use App\Http\Requests\ContactRequest;

Изменим название принимаемого класса в функции submit на ContactRequest:

public function submit(ContactRequest $req) {
    }

В файле app/Http/Requests/ContactRequest.php поменяем следующее:

public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'required|email',
            'name' => 'required',
            'subject' => 'required|min:5|max:50',
            'message' => 'required|min:15|max:500'
        ];
    }

В функции authorize мы записали return true; для того, чтобы авторизация на сайте не была обязательной. А в rules записали правила валидации.

Изменение сообщений валидации

Для изменения названия атрибутов, используется функция attributes:

public function attributes(): array
    {
        return [
            'name' => 'имя'
        ];
    }

Теперь вместо The name field is required. выводится The имя field is required.

Для изменения всего сообщения о ошибке используется функция messages:

public function messages(): array {
        return [
            'name.required' => 'Поле Имя обязательно для заполнения',
            'email.required' => 'Поле Мэйл обязательно для заполнения',
            'subject.required' => 'Поле Тема обязательно для заполнения',
            'message.required' => 'Поле Сообщение обязательно для заполнения',
            'message.min' => 'Поле Сообщение должно быть не меьше 15 символов',
        ];
    }

Создание HomeController

Создаем контроллер HomeController, в терминале прописываем следующее:

php artisan make:controller HomeController

Создался файл: app/Http/Controllers/HomeController.php

В классе HomeController прописываем следующее:

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

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

В routes/web.php изменим:

Route::get('/', 'HomeController@home')->name('home');

Route::get('/about', 'HomeController@about')->name('about');

Создание страницы добавления новостей

Создание view

Создадим файл resources/views/posts/add.blade.php . В нем запишем:

@extends('layouts.app')

@section('title-block')Добавить статью@endsection

@section('content')
    <form action="{{route('posts-add-new-post')}}" method="post">
        @csrf
        <input type="text" name="title" id="title" class="post-control" placeholder="Название"><br>
        <input type="text" name="tag" id="tag" class="post-control" placeholder="Тег"><br>
        <textarea name="message" id="message" class="post-control" placeholder="Текст статьи"></textarea><br>
        <button type="submit" class="btn btn-success">Добавить</button>
    </form>
@endsection

Создадим контроллер новостей PostsController, в терминале пропишем:

php artisan make:controller PostsController

Должен создастся файл: app/Http/Controllers/PostsController.php. В нём запишем следующее:

class PostsController extends Controller
{
    public function add() {
        return view('posts.add');
    }

    public function all() {
        return view('posts.all');
    }
}

Пропишем путь на добавления новостей и изменим имеющийся путь на отображение всех новостей. В файле routes/web.php пропишем:

Route::get('/posts/all', 'PostsController@all')->name('posts-all');
Route::get('/posts/add', 'PostsController@add')->name('posts-add');

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии