🎮 Контроллеры
Контроллеры — это обычные PHP-классы, которые отвечают за обработку HTTP-запросов и возвращают ответы пользователю.
Они помогают разделить логику приложения: маршруты описывают, какой URL обработать, а контроллер — что делать, когда этот URL вызывается.
🚀 Быстрый старт
🔍 Зачем нужны контроллеры?
Представьте, что пользователь открывает страницу «О нас»: https://site.com/about
Нам нужно:
- 📥 Поймать этот запрос.
- 🧠 Подготовить данные (например, текст со страницы).
- 📤 Вернуть HTML-страницу пользователю.
Для этого мы создаём:
- 📌 Маршрут — указывает, на какой URL реагировать.
- 🧱 Контроллер — класс, который обработает этот запрос.
🛠 Шаг 1: создаём маршрут
Откроем файл с маршрутами (например, routes/web.php) и добавим:
Route::get('/about', 'AboutController@index');Здесь:
/about— это путь в адресной строке.'AboutController@index'— означает: вызвать методindexв классеAboutController.
🧱 Шаг 2: создаём контроллер
Теперь создадим сам контроллер в папке App\Http\Controllers:
<?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:
Route::get('/user/{id}', 'UserController@show');Контроллер:
class UserController extends Controller
{
public function show($id)
{
return "Пользователь с ID: $id";
}
}🧪 Пример с запросом и шаблоном
Допустим, на странице обратной связи нужно обработать форму:
Route::post('/contact', 'ContactController@submit');Контроллер:
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']]);
}
}📁 Где хранятся контроллеры
Контроллеры по умолчанию размещаются в папке:
App\Http\ControllersЕсли ты создаёшь AboutController, его путь будет:
/core/App/Http/Controllers/AboutController.php🔗 Как подключать контроллеры в маршрутах
PageBlocks поддерживает несколько способов подключения:
🧾 Через строку Контроллер@метод
Route::get('/about', 'AboutController@index');PageBlocks сам добавит пространство имён
App\Http\Controllers.
🧾 Через массив [Класс::class, 'метод']
use PageBlocks\App\Http\Controllers\AboutController;
Route::get('/about', [AboutController::class, 'index']);Удобно для IDE и автодополнения.
🧾 Только класс — метод __invoke
Если ты подключаешь контроллер без указания метода, он должен содержать __invoke():
class ContactPageController extends Controller
{
public function __invoke()
{
return view('contact');
}
}Route::get('/contact', ContactPageController::class);Отлично подходит для страниц с одним действием: «Контакты», «Главная», «Спасибо».
📥 Внедрение зависимостей
Контроллеры (и анонимные функции в маршрутах) могут автоматически получать зависимости. PageBlocks сам передаёт:
- объект запроса
Request; - параметры маршрута (
{id},{slug}и т.д.).
📨 Внедрение объекта Request
use Boshnik\PageBlocks\Http\Request;
class ContactController extends Controller
{
public function submit(Request $request)
{
$name = $request->input('name');
return response("Привет, $name!");
}
}💡 Можно использовать и в анонимных функциях:
Route::post('/contact', function (Request $request) {
return response($request->input('name'));
});🧩 Внедрение переменных из URL
Если маршрут содержит переменные (например, /user/{id}), они передаются в метод контроллера:
Route::get('/user/{id}', 'UserController@show');class UserController extends Controller
{
public function show(Request $request, $id)
{
return response("Пользователь с ID: $id");
}
}🔁 Комбинированный пример
Route::get('/order/{id}', 'OrderController@status');class OrderController extends Controller
{
public function status(Request $request, $id)
{
$userAgent = $request->header('User-Agent');
return response("Заказ №$id. Устройство: $userAgent");
}
}