Architektura
Model
Modely jsou třídy, které reprezentují tabulky v databázi. Umožňují Vám interakci s odpovídajícími daty pomocí objektově orientované syntaxe.
Jinými slovy, modely poskytují snadný způsob pro dotazování, vkládání, aktualizaci a mazání dat v databázové tabulce. Více informací
Příkaz pro vytvoření: php artisan make:model Product
1class Product extends Model2{3 use HasFactory;4}
Pojmenování
Jednotné číslo bez přípony "Model" (User
, Product
, Category
...)
Best practices
- Dodržujte danou strukturu:
- Atributy -
$fillable
,$casts
… - Lifecycle metody -
boot()
,booted()
- Vztahy - belongs, has, morphs…
- Accessors & mutators
- Ostatní metody
- Modely by měly obsahovat pouze prvky specifické pro Laravel (vztahy, scopes…) a kód související s databází.
- Vaše business logika by měla být zapsána do tříd
Support
neboAction
.
- Použvíejte mass assignment všude, kde je to možné.
- Kód pro vytváření/upravování modelu je kratší a také čistší.
- Používejte raději
$fillable
místo$guarded
.
- Obecně je to bezpečnější princip => snižuje riziko problémů s daty.
- Větší kontrola nad atributy.
- Snadná možnost najít názvy databázových sloupců pouhým otevřením modelu.
Controller
Controllery zpracovávají požadavky a odpovědi. Ve skutečnosti jsou prostředníky mezi databází, zobrazením a obchodní logikou. Více informací
Příkaz pro vytvoření: php artisan make:controller UserController
1class UserController extends Controller2{3 //4}
Pojmenování
Jednotné číslo s příponou "Controller" (UserController
, ProductController
, CategoryController
...)
Typy
-
resource - obsahuje metody pro každou
CRUD
operaci a také metody, které představují HTML šablony, jako jsoucreate
aedit
-
api - obsahuje také metodu pro každou
CRUD
operaci, ale neobsahuje metody pro HTML šablony - invokable - controllery pro jednotlivé akce, které neodpovídají zdrojům
Best practices
- Udržujte metody controllerů co nejkratší.
- Metody controllerů by neměly obsahovat rozsáhlou business logiku.
- Jsou primárně zodpovědné jen za jednu věc - vrácení odpovědi.
- Používejte resource controllery pro
CRUD
operace.
- Resource controllery definují metody
CRUD
s dodržením jmenných konvencí.
Namespacing
Pokud máte více typů controllerů (pro API
, pro Admin...), měli byste je seskupit podle následující struktury:
1Admin/UserController.php2Api/Admin/UserController.php3Api/UserController.php4UserController.php
Request
Requesty jsou objekty, které zahrnují vstupní data z HTTP požadavku.
Poskytují pohodlný způsob, jak validovat a zpracovávat uživatelský vstup před jeho použitím v aplikaci. Více informací
Příkaz pro vytvoření: php artisan make:request StoreUserRequest
1class StoreUserRequest extends FormRequest 2{ 3 /** 4 * Determine if the user is authorized to make this request. 5 */ 6 public function authorize() 7 { 8 return true; 9 }10 11 /**12 * Get the validation rules that apply to the request.13 */14 public function rules()15 {16 return [17 //18 ];19 }20}
Pojmenování
Název metody s názvem modelu v jednotném čísle a příponou "Request" (StoreUserRequest
, StoreProductRequest
, UpdateCategoryRequest
...)
Konfigurace
Konfigurace jsou vždy uloženy v adresáři config
.
Varování: Metodu
env()
byste nikdy neměli volat přímo v aplikaci. Měli byste ji používat pouze v konfiguračních souborech a přistupovat k ní pomocí metodyconfig()
.
Best practices
- Přistupujte k hodnotám z konfigurace pouze pomocí metody
config()
. - Ukládejte vlastní nastavení aplikace do samostatného konfiguračního souboru.
- např.
project.php
- Klíče API třetích stran by měly být uloženy v souboru
services.php
.
Action
Akce jsou třídy zodpovědné za pouze jednu úlohu. Kód je tak čistší a jednodušší.
Příkaz pro vytvoření: php artisan make:action VerifyUserAction
1class VerifyUserAction 2{ 3 /** 4 * Run the action. 5 */ 6 public function run(): void 7 { 8 // 9 }10}
Tip: Tento příkaz není součástí frameworku Laravel, nainstalujte si balíček
rockero-cz/laravel-starter-kit
.
Pojmenování
Název akce s příponou "Action" (VerifyUserAction
, CreateProductAction
, ReorderCategoryAction
...)
Best practices
- Každá akce by měla obsahovat pouze jednu public metodu.
- Použijte výstižný název funkce, jako například
run()
neboexecute()
.
- Jiné pomocné metody akce by měly být private nebo protected.
- Více pomocných metod může být převedeno do tříd
Support
.
Support
Třídy Support
jsou způsob, jak seskupit související funkce a logiku do jedné třídy. Umožňují snadné znovupoužití kódu a pomáhají udržovat kód aplikace organizovaný.
Obvykle se používají k poskytování funkcionality, která se neváže na jediný model nebo controller, ale spíše se používá v několika částech aplikace.
Je to jednodušší alternativa než použití services.
Příkaz pro vytvoření: php artisan make:class Support/Cart
1class Cart2{3 //4}
Tip: Tento příkaz není součástí frameworku Laravel, nainstalujte si balíček
rockero-cz/laravel-starter-kit
.
Pojmenování
Název supportu bez přípony "Support" (Cart
, OpeningHours
, Table
...)
Routing
Typy routů
- web - Routy, které zpracovávají webové HTTP požadavky a odpovědi…
- api - Routy, které zpracovávají API požadavky a odpovědi…
- channels - Routy, které zpracovávají vysílání v reálném čase do kanálů pomocí websockets…
- console - Routy pro vlastní příkazy, které lze spustit pomocí Artisan CLI...
Best practices
- URL by měly být v množném čísle.
- Každá route by měla mít jméno.
- Routy by měly být seskupeny podle entit.
1Route::middleware('auth')->group(function () {2 Route::name('users.')->group(function () {3 Route::get('/', UserIndex::class)->name('index');4 Route::get('/{user}', UserShow::class)->name('show');5 });6});
Middleware
Middleware je způsob filtrování a úpravy příchozích HTTP požadavků v aplikaci, což umožňuje provádět různé úkoly, jako je ověřování, autorizace a správa sessionů.
Middleware byste měli vytvářet v případech, kdy potřebujete provést určitou logiku pro konkrétní skupinu routů. Více informací
Příkaz pro vytvoření: php artisan make:middleware HandleLocale
1class HandleLocale 2{ 3 /** 4 * Handle an incoming request. 5 */ 6 public function handle(Request $request, Closure $next): Response 7 { 8 return $next($request); 9 }10}
Ukázky použití
1Route::prefix('/admin')->name('admin.')->middleware(HandleLocale::class)->group(function () {2 Route::resource('users', UserController::class)->name('users');3 Route::resource('orders', OrderController::class)->name('orders');4});
Observer
Observery se používají k naslouchání určitým událostem, které nastaly u modelů, jako například created
, updated
nebo deleted
a další...
Použitím observerů můžete udržet vaše modely zaměřené na jejich hlavní odpovědnosti a zabránit zanesení další logiky. Více informací
Varování: Dotazy hromadného updatu v Eloquentu nevyvolávají event a observer tím pádem není spuštěn. Je to kvůli tomu, že modely nejsou při hromadném updatu skutečně načteny, jelikož je v pozadí proveden pouze SQL dotaz.
Příkaz pro vytvoření: php artisan make:observer UserObserver --model=User
1class UserObserver 2{ 3 /** 4 * Handle the User "created" event. 5 */ 6 public function created(User $user): void 7 { 8 // 9 }10}
Pojmenování
Jméno modelu v jednotném čísle s příponou "Observer" (UserObserver
, ProductObserver
, CategoryObserver
...)
Ukázky použití
1// Recalculate invoice when the invoice item is saved. 2public function saved(InvoiceItem $invoiceItem): void 3{ 4 $invoiceItem->invoice()->recalculate(); 5} 6 7// Set default state when the order is created. 8public function creating(Order $order): void 9{10 $order->state = OrderState::NEW;11}12 13// Delete relations before the model is deleted.14public function deleting(Order $order): void15{16 $order->products()->delete();17}
Event
Eventy jsou cesta, jak spouštět a zpracovávat akce, které se vyskytují během provozu vaší aplikace. Používají se v kombinaci s listenery.
Když je event vyvolán, Laravel upozorní všechny zaregistrované listenery k eventu, aby měly možnost provést veškeré akce. Více informací
Většinou používáme akce místo eventů, protože jsou jednodušší a srozumitelnější. Nicméně stále používáme eventy pro některé notifikace nebo v kombinaci s websockety.
Příkaz pro vytvoření: php artisan make:event OrderCreated
1class OrderCreated 2{ 3 use Dispatchable, InteractsWithSockets, SerializesModels; 4 5 /** 6 * Create a new event instance. 7 */ 8 public function __construct() 9 {10 //11 }12 13 /**14 * Get the channels the event should broadcast on.15 */16 public function broadcastOn(): Channel|array17 {18 return new PrivateChannel('channel-name');19 }20}
Vyvolání eventů
1OrderCreated::dispatch();2 3// or4 5event(new OrderCreated());
Listeners
Příkaz pro vytvoření: php artisan make:listener SendOrderCreatedNotification --event=OrderCreated
1class SendOrderCreatedNotification 2{ 3 /** 4 * Create the event listener. 5 */ 6 public function __construct() 7 { 8 // 9 }10 11 /**12 * Handle the event.13 */14 public function handle(OrderCreated $event): void15 {16 //17 }18}
Command
Příkazy jsou mocným nástrojem pro automatizaci některých úloh v aplikaci. Laravel také poskytuje sadu vestavěných příkazů, které můžete použít ihned po instalaci.
Pomocí příkazů můžete snadno provádět opakující se akce, jako je spouštění testů nebo provádění databázových migrací a to s minimálním úsilím. Více informací
Příkaz pro vytvoření: php artisan make:command FetchUsers
1class FetchUsers extends Command 2{ 3 protected $signature = 'command:name'; 4 protected $description = 'Command description'; 5 6 /** 7 * Execute the console command. 8 */ 9 public function handle(): int10 {11 return Command::SUCCESS;12 }13}
Plánování příkazů
Můžete snadno spouštět příkazy v určitých intervalech nebo časech pomocí Scheduleru.
1// app/Console/Kernel.php2protected function schedule(Schedule $schedule)3{4 $schedule->command('telescope:prune')->daily();5}