Урок 06

Контроллеры: основы

Контроллер — это класс, который группирует логику обработки запросов. Вместо замыканий в роутах код выносится в методы контроллера.

Зачем контроллеры

Замыкания хороши для простых случаев. Когда логика растёт — нужен контроллер:

  • Код структурирован по сущностям
  • Легко тестировать
  • Можно переиспользовать middleware
  • Внедрение зависимостей

Создание

php artisan make:controller PostController

Файл app/Http/Controllers/PostController.php.

Базовый контроллер

namespace App\Http\Controllers;

class PostController extends Controller
{
    public function index()
    {
        return 'Список постов';
    }

    public function show(string $id)
    {
        return "Пост #{$id}";
    }
}

Каждый публичный метод — действие.

Привязка к роутам

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);

Группировка по контроллеру

Route::controller(PostController::class)->group(function () {
    Route::get('/posts', 'index');
    Route::get('/posts/{id}', 'show');
    Route::post('/posts', 'store');
});

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

Laravel автоматически разрешает зависимости в аргументах метода:

public function show(PostService $service, string $id)
{
    return $service->find($id);
}

Класс PostService создаётся контейнером и передаётся в метод.

Ответы

return 'строка';
return view('posts.index', ['posts' => $posts]);
return response()->json(['status' => 'ok']);
return response()->json($data, 201);
return response()->noContent(); // 204
return redirect()->route('posts.index');
return back()->with('success', 'Сохранено');

Middleware в контроллере

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('admin')->only(['destroy']);
    $this->middleware('log')->except(['index']);
}

В Laravel 13 предпочтительнее задавать middleware через роут или атрибуты.