Vzor akce v Laravelu: Koncept, výhody, osvědčené postupy

Co je vzor akce v systému Laravel? Vzor Action je jednoduchý architektonický vzor používaný v Laravelu a dalších aplikacích PHP k zapouzdření jedné logické jednotky uvnitř vyhraze...

Světlý režim slouží jen pro ukázku funkcionality. Proto používejte tmavou verzi webu.

08. 07. 2025

Vzor akce v Laravelu: Koncept, výhody, osvědčené postupy

Co je vzor akce v systému Laravel?

Vzor Action je jednoduchý architektonický vzor používaný v Laravelu a dalších aplikacích PHP k zapouzdření jedné logické jednotky uvnitř vyhrazené třídy. Typicky má třída action:

  • Jediná veřejná metoda s nejčastějším názvem handle() který obsahuje základní logiku.
  • Konstruktor, který vloží všechny požadované závislosti (např. jiné akce, služby, úložiště).

Tento vzor podporuje čistší, opakovaně použitelný a lépe testovatelný kód. Akční třídy jsou obvykle umístěny pod app/Actions a slouží k udržování štíhlých a soustředěných řadičů, příkazů a úloh.

namespace App\Actions;
 
use App\Models\User;
 
class CreateUser
{
public function handle(array $data): User
{
return User::create($data);
}
}

Výhody akčního vzoru

1. Zapište jednou, volejte kdekoli (kontextově nezávislé)

Akci lze zavolat z libovolného kontextu: kontrolérů, úloh, konzolových příkazů, testů, posluchačů událostí atd.

// In a controller
class UserController extends Controller
{
public function store(Request $request, CreateUser $createUser)
{
$user = $createUser->handle($request->validated());
 
return response()->json($user);
}
}
// In a job/command
public function handle(CreateUser $createUser)
{
$createUser->handle($this->data);
}

2. Žádné irelevantní závislostní injekce

Na rozdíl od tříd služeb s mnoha nesouvisejícími metodami jsou třídy akcí zaměřené. Každá třída zpracovává jednu úlohu a dostává pouze ty závislosti, které potřebuje. Výsledkem jsou stručné a účelné konstruktory. Díky tomuto přístupu se vyhnete tomu, aby byl konstruktor naplněn mnoha injektovanými závislostmi, které mohou být použity jen několika metodami.

Na rozdíl od tříd služeb s mnoha nesouvisejícími metodami jsou třídy akcí zaměřené. Každá třída zpracovává jednu úlohu a dostává pouze ty závislosti, které potřebuje. Výsledkem jsou stručné a účelné konstruktory.

3. Snadnější testování v izolaci

Protože akce zapouzdřuje jednu pracovní jednotku, je snazší ji testovat nezávisle na vrstvě HTTP nebo jiných službách.

public function test_it_creates_a_user()
{
$action = new CreateUser();
 
$user = $action->handle([
'name' => 'Jane Doe',
'email' => 'jane@example.com',
'password' => bcrypt('password'),
]);
 
$this->assertDatabaseHas('users', [
'email' => 'jane@example.com',
]);
 
$this->assertEquals('Jane Doe', $user->name);
}

Osvědčené postupy

1. Struktura: Umístěte akce pod app/Actions

Uspořádejte své akční třídy v app/Actions adresář pro lepší vyhledatelnost.

app/
└── Actions/
├── CreateUser.php
├── UpdateUser.php

2. Úmluva o pojmenování: {Action}{Resource}.php

Používejte jasné a konzistentní pojmenování, např. CreateUser, UpdateProfile, nebo DeletePost.

3. Název metody: Preferovat handle()

Držte se handle() kvůli konzistenci s úlohami a posluchači Laravelu. Alternativy zahrnují __invoke, execute(), nebo run() ale pouze v případě, že váš tým preferuje jiný standard.

public function handle(array $data): User

4. Parametry metody

V závislosti na případu použití předejte buď prostředek a data, nebo pouze data.

// For updating existing resource
public function handle(User $user, array $data): User
 
// For creating new resource
public function handle(array $data): User

5. Zabalte logiku do DB::transaction()

Pokud vaše akce provádí více operací nebo volá jiné akce, zabalte logiku do transakce, abyste zajistili konzistenci.

public function __construct(
public SyncUserRoles $syncUserRoles,
public AssignTeam $assignTeam,
) {}
 
public function handle(array $data): User
{
return DB::transaction(function () use ($data) {
$user = User::create($data);
 
// injected actions
$this->syncUserRoles->handle($user, $data['roles']);
 
$this->assignTeam->handle($user);
 
return $user;
});
}

6. Vysílání událostí v případě potřeby

Pokud vaše akce změní prostředek a chcete o tom informovat frontend (např. prostřednictvím Reverbu nebo Inertia), vysílejte události.

use App\Events\UserCreated;
 
broadcast(new UserCreated($user))->toOthers();

7. Vrácení zdroje

Vrátí upravený nebo vytvořený prostředek z vaší akce.

return $user;

8. V případě potřeby provádějte další akce

Třídy akcí mohou být závislé na jiných akcích a vytvářet tak komplexní chování.

public function __construct(
protected SyncUserRoles $syncUserRoles,
protected AssignTeam $assignTeam,
) {}

Další zdroje

Původní článek publikoval Nabil Hassen.

Mohlo by vám pomoct

Praktické věci kolem webu

Než se pustíte do webu, hodí se mít jasno v podkladech, WordPressu, cookies a měření.

Google reference

Co říkají klienti

Ukázky skutečných recenzí, které klienti zanechali na mém Google profilu.

Přejít na recenze
★ ★ ★ ★ ★

„Člověk, který své práci a rozumí a ví co dělá. Velmi rychlá komunikace a profesionální přístup. Doporučuji.“

Jaroslav Kupča
Google
★ ★ ★ ★ ★

„Skvělá spolupráce, při dalších projektech určitě nebudu shánět někoho jiného.“

Roman Koňařík
Google
★ ★ ★ ★ ★

„S panem Vančurou jsem spolupracovala na tvorbě mých webových stránek a jsem maximálně spokojená. Oceňuji profesionální přístup, rychlou komunikaci a schopnost přesně pochopit moje představy. Web je moderní, přehledný, funkční a skvěle vypadá i na mobilu. Celý proces proběhl hladce, s jasným vysvětlením jednotlivých kroků a výborným výsledkem. Určitě doporučuji každému, kdo hledá spolehlivý a kvalitní přístup.“

Barbora Zemánková
Google
★ ★ ★ ★ ★

„Spolupráce při tvorbě konfigurátoru proběhla naprosto bez problémů. Oceňuji profesionální přístup, rychlou komunikaci a schopnost pochopit specifický projekt od A do Z. Konfigurátor je přehledný, funkční a přesně odpovídá mým požadavkům. Rozhodně doporučuji.“

mareksevcik_FPV
Google
★ ★ ★ ★ ★

„Velmi dobrá a rychlá spolupráce. Doporučuji!“

Leoš Kaucký
Google
★ ★ ★ ★ ★

„Přesně takto si představujeme profesionální práci. Dekujeme“

STAVILLI
Google
★ ★ ★ ★ ★

„Ať už se jedná o optimalizaci webu, nebo tvorbu na míru oceňuji kromě profesionální práce a znalostí problematiky také férový přístup a komunikaci.“

Aleš Illický
Google
★ ★ ★ ★ ★

„Děkuji za profesionální spolupráci, vše dle domluvy, naprostá spokojenost a mohu jen vřele doporučit.... Při dalších projektech určitě opět využiji Vašich služeb“

Peter Spilak
Google
★ ★ ★ ★ ★

„Profesionalita a velká ochota, nemohu jinak než doporučit“

Magdalena Vašková
Google
★ ★ ★ ★ ★

„Skvělá zkušenost při tvorbě webu, profesionální přístup, rychlost, ochota pomoci“

Jana Kono
Google
★ ★ ★ ★ ★

„Rychlá spolupráce a komunikace – mohu jen doporučit.“

Gawix
Google
★ ★ ★ ★ ★

„Moc mi pomohl, když jsem potřebovala pomoc s webem. A bylo to gratis :)). Jsem mu neskonale vděčná.“

Radka Arbesová
Google
★ ★ ★ ★ ★

„Děkuji Jiřímu za rychlou a kvalitní spolupráci na tvorbě webu. Srozumitelná a ochotná komunikace mě vždycky potěší a přináší důvěru.“

Jiří Mařík
Google
★ ★ ★ ★ ★

„Jsem maximálně spokojená. Rychlost, ochota a cenově dostupné. Děkuji“

Veronika Černá
Google
★ ★ ★ ★ ★

„Naprostá spokojenost. Rychlá komunikace, skvělá cena a odborná pomoc. Moc děkuji :)“

Patricie Kučerová
Google
★ ★ ★ ★ ★

„Velká spokojenost, rychlost a p. Vančura moc dobře ví co dělá. :)“

Ondřej Daniško
Google
★ ★ ★ ★ ★

„dobrá práce, rychlá odezva“

Zuzana Jírová
Google
★ ★ ★ ★ ★

„S programátory mám zkušeností hodně, ale tady musím opravdu pochválit. Pro mě a mé přátele vytvořil skvělý nástroj na evidenci sbírek a opravdu se to povedlo. Bylo to hotové rychle, kvalitně a za skvělou cenu. Komunikace funguje velmi rychle, což je super a ne úplně standard. Díky za super práci, za mě 100% spokojenost!“

Zdeněk
Google
★ ★ ★ ★ ★

„Vše bylo rychlé a hlavně to funguje. Dobrá práce.“

Lukáš Bartášek
Google
★ ★ ★ ★ ★

„Normálně recenze nepíši, ale zde rád doporučím kvalitní práci. Jiří pro mě vytvořil web pro dětské tábory. Kvalitní práce, rychlá komunikace a vlastní nápady, které Jiří sám přidá, jsou na velice vysoké úrovni. Nemohu hodnotit jinak než 5/5.“

Tomáš Loněk
Google
★ ★ ★ ★ ★

„Pan Jiri nam delal jiz 3 webove stranky a vzdy velka spokojenost, je mega rychly a vse hned kladne vyridi, mohu pouze doporucit. Poradi si bez problemu i s rezervacnimi kalendaremi, udrzbou socialnich siti, atd.“

Barbara Mašková
Google