В 3-ем уроке мы погрузимся в сердце Laravel, это контроллеры. Если вы только начинаете свой путь, этот урок станет фундаментом для понимания того, как управлять логикой приложения. Мы разберем создание контроллеров, их связь с роутами, работу с ресурсными контроллерами и даже освоим внедрение зависимостей.
Что такое контроллеры?
Контроллеры в Laravel это посредники между вашими моделями (данными) и представлениями (интерфейсом). Они обрабатывают HTTP-запросы, выполняют бизнес-логику и возвращают ответ пользователю. Представьте, что это дирижер оркестра: он решает, какие действия выполнить при каждом запросе.
Создание контроллера через Artisan
Laravel предоставляет удобный инструмент командной строки Artisan.
С его помощью можно быстро сгенерировать контроллер.
Шаг 1: Генерация базового контроллера
Откройте терминал и выполните:
php artisan make:controller PostController
Эта команда создаст файл PostController.php
в папке app/Http/Controllers
.
Шаг 2: Структура контроллера
Откройте созданный файл. Вы увидите:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
// Методы будут здесь
}
Все контроллеры наследуются от базового класса Controller
, что дает доступ к полезным методам.
Связь роутов с методами контроллера
Теперь научимся направлять запросы к конкретным методам контроллера.
Пример 1: Простая связь
В файле routes/web.php
добавьте:
use App\Http\Controllers\PostController; Route::get('/posts', [PostController::class, 'index']);
Здесь запрос на /posts
вызовет метод index
в PostController
.
Добавим метод в контроллер:
public function index() { return view('posts.index'); // Вернет представление posts/index.blade.php }
Пример 2: Передача параметров
Допустим, нам нужно отобразить один пост по ID.
В роуте:
Route::get('/posts/{id}', [PostController::class, 'show']);
В контроллере:
public function show($id) { $post = Post::find($id); // Предполагаем, что модель Post уже создана return view('posts.show', ['post' => $post]); }
Resource-контроллеры для CRUD-операций
Resource-контроллеры автоматически создают методы для CRUD (Create, Read, Update, Delete).
Это экономит время и стандартизирует код.
Шаг 1: Создание Resource-контроллера
Выполните:
php artisan make:controller PostController --resource
В классе появятся методы: index
, create
, store
, show
, edit
, update
, destroy
.
Шаг 2: Регистрация Resource-роутов
В routes/web.php
:
Route::resource('posts', PostController::class);
Эта строка создаст все необходимые роуты:
- GET /posts → index
- GET /posts/create → create
- POST /posts → store
- GET /posts/{id} → show
- GET /posts/{id}/edit → edit
- PUT/PATCH /posts/{id} → update
- DELETE /posts/{id} → destroy
Пример методов Resource-контроллера
// Отображение формы создания поста public function create() { return view('posts.create'); } // Сохранение поста в БД public function store(Request $request) { $validated = $request->validate([ 'title' => 'required|max:255', 'content' => 'required', ]); Post::create($validated); return redirect('/posts'); }
Внедрение зависимостей в контроллеры
Laravel позволяет автоматически внедрять зависимости в методы контроллера.
Это удобно для работы с сервисами, репозиториями или другими классами.
Пример 1: Внедрение Request
Вы уже видели это в методе store
:
public function store(Request $request)
Laravel автоматически передает объект запроса.
Пример 2: Собственный сервис
Допустим, у нас есть класс PostService
.
Зарегистрируем его в сервис-контейнере в app/Providers/AppServiceProvider.php
:
public function register() { $this->app->bind(PostService::class, function ($app) { return new PostService(); }); }
Теперь можем внедрить его в контроллер:
use App\Services\PostService; public function __construct(PostService $postService) { $this->postService = $postService; } public function index() { $posts = $this->postService->getAllPosts(); return view('posts.index', ['posts' => $posts]); }
Практические задачи
Закрепим знания на практике!
Задача 1: Создайте контроллер для статей
- Сгенерируйте
ArticleController
через Artisan. - Добавьте методы
index
иshow
. - Свяжите их с роутами
/articles
и/articles/{id}
.
Задача 2: Реализуйте Resource-контроллер
- Создайте
ProductController
с опцией--resource
. - Зарегистрируйте Resource-роуты.
- Реализуйте логику для вывода списка товаров и формы создания.
Задача 3: Внедрение зависимости
- Создайте сервис
UserService
с методомgetAllUsers()
. - Зарегистрируйте его в сервис-контейнере.
- Внедрите в
UserController
и выведите список пользователей.
Итоги третьего урока
В этом уроке мы разобрали, как создавать контроллеры, связывать их с роутами, использовать Resource-контроллеры для CRUD-операций и внедрять зависимости в контроллеры. Эти знания помогут вам создавать более структурированные и поддерживаемые приложения на Laravel.
Если вы хотите углубить свои знания и изучить Laravel от А до Я, рекомендую ознакомиться с полным курсом по Laravel для начинающих: https://max-gabov.ru/laravel-dlya-nachinaushih.
Надеюсь этот урок был полезен для вас. Если у вас есть вопросы или вы хотите поделиться своими успехами, оставляйте комментарии ниже.