Skip to content

🎮 Контроллеры

Контроллеры — это обычные PHP-классы, которые отвечают за обработку HTTP-запросов и возвращают ответы пользователю.

Они помогают разделить логику приложения: маршруты описывают, какой URL обработать, а контроллер — что делать, когда этот URL вызывается.

🚀 Быстрый старт

🔍 Зачем нужны контроллеры?

Представьте, что пользователь открывает страницу «О нас»: https://site.com/about

Нам нужно:

  1. 📥 Поймать этот запрос.
  2. 🧠 Подготовить данные (например, текст со страницы).
  3. 📤 Вернуть HTML-страницу пользователю.

Для этого мы создаём:

  • 📌 Маршрут — указывает, на какой URL реагировать.
  • 🧱 Контроллер — класс, который обработает этот запрос.

🛠 Шаг 1: создаём маршрут

Откроем файл с маршрутами (например, routes/web.php) и добавим:

php
Route::get('/about', 'AboutController@index');

Здесь:

  • /about — это путь в адресной строке.
  • 'AboutController@index' — означает: вызвать метод index в классе AboutController.

🧱 Шаг 2: создаём контроллер

Теперь создадим сам контроллер в папке App\Http\Controllers:

php
<?php

namespace PageBlocks\App\Http\Controllers;

class AboutController extends Controller
{
    public function index()
    {
        return view('about'); // отобразим шаблон about.tpl
    }
}

Что здесь происходит:

  • AboutController — обычный PHP-класс.
  • index() — метод, вызываемый при переходе на /about.
  • view('about') — возвращает HTML-шаблон about.tpl.

🧠 Что делает контроллер?

Контроллер:

  • получает запрос от браузера,
  • выполняет нужную логику (например, берёт данные из базы),
  • возвращает ответ — HTML, JSON или просто текст.

Это как диспетчер: запрос пришёл → посмотрел, что нужно → отдал нужную информацию.

💡 Пример с параметром

Допустим, мы хотим показать пользователя по ID:

php
Route::get('/user/{id}', 'UserController@show');

Контроллер:

php
class UserController extends Controller
{
    public function show($id)
    {
        return "Пользователь с ID: $id";
    }
}

🧪 Пример с запросом и шаблоном

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

php
Route::post('/contact', 'ContactController@submit');

Контроллер:

php
use Boshnik\PageBlocks\Http\Request;

class ContactController extends Controller
{
    public function submit(Request $request)
    {
        $data = $request->validate([
            'name' => 'required',
            'email' => 'required|email',
        ]);

        // Сохраняем или отправляем письмо...

        return view('contact-success', ['name' => $data['name']]);
    }
}

📁 Где хранятся контроллеры

Контроллеры по умолчанию размещаются в папке:

html
App\Http\Controllers

Если ты создаёшь AboutController, его путь будет:

html
/core/App/Http/Controllers/AboutController.php

🔗 Как подключать контроллеры в маршрутах

PageBlocks поддерживает несколько способов подключения:

🧾 Через строку Контроллер@метод

php
Route::get('/about', 'AboutController@index');

PageBlocks сам добавит пространство имён App\Http\Controllers.

🧾 Через массив [Класс::class, 'метод']

php
use PageBlocks\App\Http\Controllers\AboutController;

Route::get('/about', [AboutController::class, 'index']);

Удобно для IDE и автодополнения.

🧾 Только класс — метод __invoke

Если ты подключаешь контроллер без указания метода, он должен содержать __invoke():

php
class ContactPageController extends Controller
{
    public function __invoke()
    {
        return view('contact');
    }
}
php
Route::get('/contact', ContactPageController::class);

Отлично подходит для страниц с одним действием: «Контакты», «Главная», «Спасибо».

📥 Внедрение зависимостей

Контроллеры (и анонимные функции в маршрутах) могут автоматически получать зависимости. PageBlocks сам передаёт:

  • объект запроса Request;
  • параметры маршрута ({id}, {slug} и т.д.).

📨 Внедрение объекта Request

php
use Boshnik\PageBlocks\Http\Request;

class ContactController extends Controller
{
    public function submit(Request $request)
    {
        $name = $request->input('name');

        return response("Привет, $name!");
    }
}

💡 Можно использовать и в анонимных функциях:

php
Route::post('/contact', function (Request $request) {
    return response($request->input('name'));
});

🧩 Внедрение переменных из URL

Если маршрут содержит переменные (например, /user/{id}), они передаются в метод контроллера:

php
Route::get('/user/{id}', 'UserController@show');
php
class UserController extends Controller
{
    public function show(Request $request, $id)
    {
        return response("Пользователь с ID: $id");
    }
}

🔁 Комбинированный пример

php
Route::get('/order/{id}', 'OrderController@status');
php
class OrderController extends Controller
{
    public function status(Request $request, $id)
    {
        $userAgent = $request->header('User-Agent');

        return response("Заказ №$id. Устройство: $userAgent");
    }
}

© PageBlocks 2019-present