Back

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 Model
2{
3 use HasFactory;
4}

Pojmenování

Jednotné číslo bez přípony "Model" (User, Product, Category...)

Best practices

  1. Dodržujte danou strukturu:
  • Atributy - $fillable, $casts
  • Lifecycle metody - boot(), booted()
  • Vztahy - belongs, has, morphs…
  • Accessors & mutators
  • Ostatní metody
  1. 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 nebo Action.
  1. 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ší.
  1. 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 Controller
2{
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 jsou create a edit
  • 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

  1. 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.
  1. 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.php
2Api/Admin/UserController.php
3Api/UserController.php
4UserController.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í metody config().

Best practices

  1. Přistupujte k hodnotám z konfigurace pouze pomocí metody config().
  2. Ukládejte vlastní nastavení aplikace do samostatného konfiguračního souboru.
  • např. project.php
  1. 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

  1. Každá akce by měla obsahovat pouze jednu public metodu.
  • Použijte výstižný název funkce, jako například run() nebo execute().
  1. 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 Cart
2{
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

  1. URL by měly být v množném čísle.
  2. Každá route by měla mít jméno.
  3. 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): void
15{
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|array
17 {
18 return new PrivateChannel('channel-name');
19 }
20}

Vyvolání eventů

1OrderCreated::dispatch();
2 
3// or
4 
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): void
15 {
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(): int
10 {
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.php
2protected function schedule(Schedule $schedule)
3{
4 $schedule->command('telescope:prune')->daily();
5}
Edit this page

We are hiring!