Laravel любит напихивать в код всё подряд: REST-контроллеры с десятком методов, ресурсы, авторизация, middleware и прочие танцы. Но иногда у тебя задача уровня: "на главной вывести одну вьюху". Для этого городить целый "контроллер-монстра" из 7 методов — бред.
Решение простое: контроллер с одним действием. В PHP для этого есть магический метод __invoke. Laravel умеет его вызывать напрямую, так что можно не плодить лишний мусор.
Как это выглядит
Создаёшь контроллер:
php artisan make:controller HomeController
Открываешь файл и делаешь вместо кучи методов один:
namespace App\Http\Controllers;
class HomeController extends Controller
{
public function __invoke()
{
return view('home');
}
}
Всё. Никаких index(), show(), edit() — один метод __invoke.
Как врубить маршрут
В routes/web.php указываешь:
use App\Http\Controllers\HomeController;
Route::get('/', HomeController::class);
Теперь при заходе на / Laravel поймёт, что надо дёрнуть __invoke().
Когда это уместно
- Простая страница без лишней логики (домашняя, страница политики, статическая вьюха).
- Endpoint, который решает ровно одну задачу (например, вебхук от платёжки).
- Мелкие сервисные точки, где городить полноценный контроллер тупо избыточно.
Подводные камни
Тут, по сути, один момент: если через месяц к этому контроллеру прилипнет ещё два метода, то __invoke начнёт выглядеть странно. Придётся переименовывать всё обратно в "нормальный" контроллер. Так что это решение для случаев, когда ты уверен, что тут реально одно действие и всё.
Вывод
Контроллер с __invoke — это минимализм без лишнего хлама. Если твой контроллер — это одна кнопка, не строй вокруг него панель управления. Сделай просто __invoke и живи спокойно.
0 комментариев