PHP Laravel контроллеры

Все исходники / Язык программирования PHP / OS Windows / Веб программирование / Frameworks для сайтов и веб-приложений / PHP Laravel контроллеры
Оглавление:
  1. Фреймворк Laravel - Controllers
  2. Создание контроллера Laravel
  3. Action-методы контроллера
  4. Action-метод контроллера с параметром
  5. Получение данных HTML forms
  6. Определение URL-адресов для действий контроллеров
  7. Представления с наследованием шаблона
  8. Исходник примера работы контроллеров Laravel

Фреймворк Laravel - Controllers

Логотип фреймворка PHP Laravel

На странице последовательное описание с примерами кода создания контроллеров, маршрутов и представлений для фреймворка Laravel.

В MVC (Model-View-Controller) модель, представление, контроллер комплексно и неразрывно связаны. Но особая роль отводится все же контроллеру: он связывает представление и модель, а может и вовсе обходится без них. Например, веб-страницы AJAX взаимодействия, веб-страницы логических операций, веб-страницы игр и другое.

Контроллер, посредством маршрутизатора, принимает запросы от пользователей и отправляет сформированные ответы обратно. Для этого он может задействовать модели таблиц базы данных, функциональность классов бизнес-логики и вспомогательные функции.

Внизу страницы прикреплен исходник примера сайта использования контроллеров в фреймворке Laravel. Исходник написан в MS Visual Studio Code – кроссплатформенном редакторе кода профессионального уровня. Перед тестированием исходного кода необходимо установить интерпретатор PHP и менеджер зависимостей Composer .

Создание контроллера Laravel

В 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-методы контроллера

Методы контроллера, отвечающие на запросы клиентов, называются действиями (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 на страницу будет отправляться текст приветствия.

Action-метод контроллера с параметром

Контроллеры могут быть с параметрами. Создадим контроллер 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), ошибка отправляться не будет и сайт будет работать некорректно.

Получение данных HTML forms

Добавим 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-адресов для действий контроллеров

Маршрутизация URL-адресов для страниц веб-приложения в Laravel определяется в файле routes/web.php. Каждый action-метод контроллера в маршрутизаторе связывается с конкретным URL-адресом.

Статические функции класса Route get(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. Разметка мастер-страницы:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel Controllers demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>
    <div class="mb-2 py-3 fs-6 text-center bg-body-secondary ">
        <a href="/" class="me-2">Главная</a>
        <a href="/pages/page1" class="me-2">Страница 1</a>
        <a href="/pages/page2">Страница 2</a>
        <a href="/home/comments">Комментарии</a>
    </div>
    {{-- Место вставки контента --}}
    <div class="container my-4">
        <div class="row">
            <div class="col text-center ">
                @yield('content')
            </div>
        </div>
    </div>
</body>
</html>

Разметка представления home.index:

@extends('shared.layout')

@section('content')
    <h1>{{ $greeting }}</h1>
@endsection

Разметка страницы pages.page:

@extends('shared.layout')

@section('content')

<h1>{{ $greeting }}</h1>

@endsection

Разметка страницы home.comments

@extends('shared.layout')

@section('content')

<h1>Комментарии посетителей</h1>
<div class="mt-4"><p>Комментарий: {{ $comment }}</p></div>

<form method="POST" action="/home/comments" class="mt-5">
    @csrf
    <div class="input-group m-auto" style="max-width:300px;">
        <button class="btn btn-outline-primary" type="submit" id="button-addon1">Отправить</button>
        <input type="text" class="form-control" placeholder="Для комментария"
            aria-label="" aria-describedby="button-addon1" name="comment">
    </div>
</form>

@endsection

Для защиты от атак с подделкой межсайтовых запросов (CSRF), в HTML формы представлений Laravel обязательно включается токен @csrf. Если вы забудете его добавить в форму, то отправки данных на сервер не будет и выбросится ошибка 419 PAGE EXPIRED.

Исходник примера работы контроллеров Laravel

Исходник представляет собой небольшой сайт на контроллерах и представлениях, для упрощения роль моделей исполняет программный код в action-методах контроллеров.

Исходник написан в редакторе кода Visual Studio Code. Для комфортной работы с фреймворком PHP Laravel желательно установить следующие расширения:
- PHP Tools for Visual Studio Code,
- Laravel Blade formatter,
- Laravel Extra Intellisense,
и другие по вашим предпочтениям. Установить расширения можно непосредственно из редактора кода или скачать с официального сайта Extensions for Visual Studio Code.

Скачать исходник

Тема: «PHP Laravel контроллеры» Язык программирования PHP LaravelControllers-vscode.zip Размер:25554 КбайтЗагрузки:9