Из корня нашего проекта в терминале прописываем команду:
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');