Контроллеры: основы
Контроллер — это класс, который группирует логику обработки запросов. Вместо замыканий в роутах код выносится в методы контроллера.
Зачем контроллеры
Замыкания хороши для простых случаев. Когда логика растёт — нужен контроллер:
- Код структурирован по сущностям
- Легко тестировать
- Можно переиспользовать 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 через роут или атрибуты.