Action Pattern v Laravelu
Krátký popis: Action Pattern je moderní způsob, jak udržet váš kód v Laravelu organizovaný, znovupoužitelný a snadno testovatelný. Naučte se, jak vytáhnout byznys logiku do samostatných tříd.
1. Jak to vypadá běžně (The "Fat Controller" Way)
Většina začátečníků a menších projektů píše veškerou logiku (validaci, nahrávání souborů, odesílání e-mailů, zápis do DB) přímo do metody controlleru. To vede k nepřehledným souborům, které je těžké testovat a nelze je znovu použít jinde.
Příklad v Controlleru:
public function store(Request $request)
{
// Veškerá logika je v jedné metode
$validated = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
]);
$user = User::create($validated);
// Další logika, kterou možná budeme potřebovat i jinde
Mail::to($user)->send(new WelcomeMessage($user));
Log::info('Nový uživatel vytvořen: ' . $user->id);
return back()->with('success', 'Uživatel byl vytvořen.');
}1. Jak to vypadá s Action Patternem
Action Pattern vyčlení jednu konkrétní činnost (např. "Vytvořit uživatele") do samostatné třídy s jedinou metodou. Controller pak jen tuto akci zavolá.
Krok 1: Vytvoření Action třídy
namespace App\Actions;
use App\Models\User;
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeMessage;
use Illuminate\Support\Facades\Log;
class CreateUserAction {
public function execute(array $data): User {
$user = User::create($data);
Mail::to($user)->send(new WelcomeMessage($user));
Log::info('Nový uživatel vytvořen přes Action: ' . $user->id);
return $user;
}
}Krok 2: Čistý Controller
Díky Dependency Injection Laravelu si třídu jednoduše vložíte do metody a zavoláte ji.
class UserController extends Controller {
public function store(Request $request, CreateUserAction $createUserAction) {
$validated = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
]);
$createUserAction->execute($validated);
return back()->with('success', 'Uživatel byl vytvořen pomocí Action.');
}
}1. Hlavní výhody a nevýhody
Výhody:
• Znovupoužitelnost: Stejnou akci (CreateUserAction) můžete zavolat z webového controlleru, z API, nebo třeba z importního Artisan příkazu. Nemusíte kód kopírovat.
• Skvělá testovatelnost: Můžete psát unit testy přímo pro danou Action třídu bez nutnosti simulovat celý HTTP request na controller.
• Čitelnost (SRP): Dodržujete princip jedné odpovědnosti. Jedna třída dělá přesně jednu věc. Controllery zůstávají krásně štíhlé.
• Snadná údržba: Pokud se změní proces registrace (např. přidáte odeslání SMS), změníte to pouze na jednom místě v Action třídě.
Nevýhody:
• Více souborů: Pro každou drobnost vytváříte novou třídu, což může při velkém množství akcí působit nepřehledně, pokud nemáte dobrou strukturu složek.
• Režie u jednoduchých operací: Pokud vaše metoda v controlleru pouze uloží jeden záznam do DB, je vytvoření Action třídy pravděpodobně zbytečné.
Závěr: Proč Action Pattern ovládl moderní Laravel aplikace?
Action Pattern se stal v posledních letech standardem v moderním vývoji Laravel aplikací. Zatímco Repository Pattern se stará o to, jak data získáváme, Action Pattern řeší to, co se s daty děje – tedy naši byznys logiku.
Pokud pracujete v týmu nebo budujete projekt, který má přežít déle než pár měsíců, rozbití logiky do Actions je nejlepší způsob, jak udržet kód pod kontrolou. Začněte s ním u procesů, které jsou složité nebo se opakují na více místech, a uvidíte, jak se váš vývojářský život zjednoduší.