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