На странице последовательное описание с примерами кода создания контроллеров, маршрутов и представлений для фреймворка Laravel.
В MVC (Model-View-Controller) модель, представление, контроллер комплексно и неразрывно связаны. Но особая роль отводится все же контроллеру: он связывает представление и модель, а может и вовсе обходится без них. Например, веб-страницы AJAX взаимодействия, веб-страницы логических операций, веб-страницы игр и другое.
Контроллер, посредством маршрутизатора, принимает запросы от пользователей и отправляет сформированные ответы обратно. Для этого он может задействовать модели таблиц базы данных, функциональность классов бизнес-логики и вспомогательные функции.
Внизу страницы прикреплен исходник примера сайта использования контроллеров в фреймворке Laravel. Исходник написан в MS Visual Studio Code – кроссплатформенном редакторе кода профессионального уровня. Перед тестированием исходного кода необходимо установить интерпретатор PHP и менеджер зависимостей Composer .
В Laravel, контроллер — это PHP класс, расширяющий базовый класс Controller. Базовый класс предоставляет вашему контроллеру middleware ( проверка и фильтрация HTTP-запросов), authorize (встроенные службы аутентификации) и возможно другие сервисы в зависимости от версии фреймворка.
Можно также без проблем создавать собственные контроллеры без наследования от базового класса, а дополнительные функции фреймворка подключать по мере необходимости. В прикрепленном исходнике пример такого контроллера - PageController.
По умолчанию контроллеры хранятся в каталоге app/Http/Controllers. Методы контроллера предназначены для ответа на входящие HTTP-запросы. Создание контроллера вручную подразумевает создание php-файла с названием класса контроллера и написание кода класса.
Контроллеры удобно создавать при помощи Artisan входящего в состав Laravel. Artisan – командный помощник веб-разработчика, работает в окне командной строки. Одна команда и создается контроллер со стартовым программным кодом. В Visual Studio Code команды Artisan выполняются терминале, который можно вызвать из меню View->Terminal или Terminal->New Terminal.
Новый контроллер создается командой: php artisan make:controller HomeController Home – название контроллера и для обозначения функциональности после названия стандартно принято добавлять постфикс Controller. В результате создается стартовый код класса с полным названием HomeController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
//
}
Методы контроллера, отвечающие на запросы клиентов, называются действиями (action) и они обязательно должны определяться как общедоступные (public). Методы контроллера, определенные как private не работают в маршрутах, но их можно использовать как вспомогательные функции внутри контроллера.
Добавим в класс HomeController action-метод с кодом для вывода текста на главную страницу:
<?php
namespace App\Http\Controllers;
class HomeController extends Controller
{
// Action-метод для домашней страницы
public function index()
{
// Переменная хранения текста
$greeting = "Здравствуй Мир! Я Laravel!";
// Возврат представления и передача в него данных.
return view("home.index", ["greeting" => $greeting]);
}
}
Теперь при вызове метода index() через переменную $greeting на страницу будет отправляться текст приветствия.
Контроллеры могут быть с параметрами. Создадим контроллер PageController с методом, который имеет входной параметр. Такой action-метод контроллера может отвечать на множество URL-адресов, сформированных по определенному шаблону. Можно заметить также, что PageController не имеет базового класса.
<?php
namespace App\Http\Controllers;
class PageController
{
//
public function pages(string $uri)
{
$greeting = "Привет, я ";
switch ($uri) {
case "page1":
case "page2":
$greeting .= $uri;
break;
// Если закомментировать эту строку,
// ошибка 404 отправляться не будет.
default: abort(404);
}
return view("pages.page", ["greeting" => $greeting]);
}
}
Метод pages анализирует входной параметр: существует запрошенная страница – отправляется приветствие, в противном случае генерируется ошибка 404. Если закомментировать строку с функцией abort(404), ошибка отправляться не будет и сайт будет работать некорректно.
Добавим action-метод comments в HomeController (см. выше) для обработки отправленных пользователями комментариев. Данный метод имеет параметр типа Request посредством которого извлекаются данные HTML forms страницы сайта.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function index()
{
...
}
public function comments(Request $request)
{
$comment = "Нет комментариев.";
$post_var = $request->input('comment');
if($post_var != null){
$comment = $post_var;
}
return view("home.comments", ["comment" => $comment]);
}
}
После проверки на наличие комментариев, они выводятся на веб-страницу.
Маршрутизация URL-адресов для страниц веб-приложения в Laravel определяется в файле routes/web.php. Каждый action-метод контроллера в маршрутизаторе связывается с конкретным URL-адресом.
Статические функции класса Routeget(post) определяют тип запроса, url, контроллер и его action-метод. Конструкция [HomeController::class,"index"] указывает полное имя класса контроллера вместе с пространством имен и название вызываемого метода.
<?php
// файл routes/web.php
use App\Http\Controllers\HomeController;
use App\Http\Controllers\PageController;
use Illuminate\Support\Facades\Route;
// Фиксированные веб-адреса
Route::get("/", [HomeController::class,"index"]);
Route::get("/home/comments", [HomeController::class,"comments"]);
Route::post("/home/comments", [HomeController::class,"comments"]);
// Шаблонный веб-адрес
Route::get("/pages/{uri}", [PageController::class,"pages"]);
Создадим простую иерархию представлений, которые возвращают методы контроллеров, описанных выше:
views
shared
layout.blade.php
home
index.blade.php
comments.blade.php
pages
page.blade.php
Представления построены на стандартном для Laravel движке Blade. shared.layout.blade.php — это мастер-страница, шаблон для всех представлений, наполнена стандартным контентом HTML 5. Разметка мастер-страницы:
Для защиты от атак с подделкой межсайтовых запросов (CSRF), в HTML формы представлений Laravel обязательно включается токен @csrf. Если вы забудете его добавить в форму, то отправки данных на сервер не будет и выбросится ошибка 419 PAGE EXPIRED.
Исходник представляет собой небольшой сайт на контроллерах и представлениях, для упрощения роль моделей исполняет программный код в action-методах контроллеров.
Исходник написан в редакторе кода Visual Studio Code. Для комфортной работы с фреймворком PHP Laravel желательно установить следующие расширения:
- PHP Tools for Visual Studio Code,
- Laravel Blade formatter,
- Laravel Extra Intellisense,
и другие по вашим предпочтениям. Установить расширения можно непосредственно из редактора кода или скачать с официального сайта Extensions for Visual Studio Code.