Ресурсний контролер описує CRUD над однією сутністю: index, show, store, update, destroy. Але не кожна дія вкладається в ці сім методів.
class PublishPostController
{
public function __invoke(Post $post, PublishPost $publish): RedirectResponse
{
Gate::authorize('publish', $post);
$publish($post);
return back()->with('status', 'Опубліковано');
}
}
Route::post('/posts/{post}/publish', PublishPostController::class);
Коли __invoke доречний:
- дія не є CRUD: «опублікувати», «скасувати замовлення», «експортувати звіт»;
- у дії свої залежності, які не потрібні іншим методам;
- ресурсний контролер розрісся до десятка нестандартних методів.
Коли ресурсний: стандартні операції над сутністю - так маршрути й імена передбачувані (posts.update), а Route::resource() реєструє їх одним рядком.
Типова еволюція: PostController з методами publish, unpublish, duplicate, export розбивають на ресурсний CRUD і кілька контролерів-дій. Кожен файл короткий, назва каже, що він робить, а залежності не змішуються.
Контролер-дія не замінює клас-дію: перший - про HTTP, другий - про бізнес-логіку, яку можна викликати звідусіль.