Урок 3: Контроллеры в Laravel. Создание, роуты, Resource, DI

В 3-ем уроке мы погрузимся в сердце Laravel, это контроллеры. Если вы только начинаете свой путь, этот урок станет фундаментом для понимания того, как управлять логикой приложения. Мы разберем создание контроллеров, их связь с роутами, работу с ресурсными контроллерами и даже освоим внедрение зависимостей.

Что такое контроллеры?

Контроллеры в Laravel это посредники между вашими моделями (данными) и представлениями (интерфейсом). Они обрабатывают HTTP-запросы, выполняют бизнес-логику и возвращают ответ пользователю. Представьте, что это дирижер оркестра: он решает, какие действия выполнить при каждом запросе.

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

Laravel предоставляет удобный инструмент командной строки Artisan.
С его помощью можно быстро сгенерировать контроллер.

Шаг 1: Генерация базового контроллера

Откройте терминал и выполните:

bash
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-контроллера

Выполните:

bash
php artisan make:controller PostController --resource

В классе появятся методы: indexcreatestoreshoweditupdatedestroy.

Шаг 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: Создайте контроллер для статей

  1. Сгенерируйте ArticleController через Artisan.
  2. Добавьте методы index и show.
  3. Свяжите их с роутами /articles и /articles/{id}.

Задача 2: Реализуйте Resource-контроллер

  1. Создайте ProductController с опцией --resource.
  2. Зарегистрируйте Resource-роуты.
  3. Реализуйте логику для вывода списка товаров и формы создания.

Задача 3: Внедрение зависимости

  1. Создайте сервис UserService с методом getAllUsers().
  2. Зарегистрируйте его в сервис-контейнере.
  3. Внедрите в UserController и выведите список пользователей.

Итоги третьего урока

В этом уроке мы разобрали, как создавать контроллеры, связывать их с роутами, использовать Resource-контроллеры для CRUD-операций и внедрять зависимости в контроллеры. Эти знания помогут вам создавать более структурированные и поддерживаемые приложения на Laravel.

Если вы хотите углубить свои знания и изучить Laravel от А до Я, рекомендую ознакомиться с полным курсом по Laravel для начинающих: https://max-gabov.ru/laravel-dlya-nachinaushih.

Надеюсь этот урок был полезен для вас. Если у вас есть вопросы или вы хотите поделиться своими успехами, оставляйте комментарии ниже.