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 и живи спокойно.