Publikováno
· Autor: Zdeněk Hejzlar · Pod kapotou · Základy · 3 min čtení
Obsah článku
Laravel je přívětivý framework, ale právě proto svádí k rychlým řešením, která se později vymstí. Když všechno „nějak funguje", je snadné přehlédnout, že kód je časovaná bomba. Sám jsem si těmi chybami prošel, takže to není kritika shora — spíš zkratka, jak nešlápnout do stejných děr. Sepsal jsem ty, které vídám nejčastěji, a hlavně jak je dělat správně.
Všechno naházené do kontroleru
Klasika. Kontroler o dvou stech řádcích, který validuje, počítá, posílá e-maily a ještě formátuje výstup. Za měsíc se v tom nevyzná nikdo.
// ŠPATNĚ: logika i validace v kontroleru
public function store(Request $request)
{
$request->validate(['email' => 'required|email']);
// + dalších 150 řádků logiky
}
// LÉPE: validaci do Form Requestu, logiku do service
public function store(StoreOrderRequest $request, OrderService $orders)
{
$orders->create($request->validated());
}
Proč používat Form Request místo validace v kontroleru rozebírám v samostatném článku.
Ruční SQL místo Eloquentu
Začátečník přicházející z čistého PHP často skládá SQL ručně, protože je to zvyk. Přitom Eloquent je čitelnější, kratší a chrání databázi před útoky sám tím, že hodnoty do dotazu předává bezpečně. Ruční SQL má své místo u opravdu složitých dotazů, ale u běžné práce s modely je to zbytečné riziko i práce navíc.
// ŠPATNĚ: ruční a zranitelné
$users = DB::select("SELECT * FROM users WHERE email = '$email'");
// LÉPE: čitelné a bezpečné
$users = User::where('email', $email)->get();
Ruční skládání SQL navíc otevírá dveře útokům přes podvržený vstup — hodnoty proto vždy předávejte přes Eloquent nebo vázané parametry, ne přímo do řetězce dotazu.
N+1 dotazy
Neviditelná chyba, dokud tabulka nemá pár tisíc řádků. Aplikace pak místo dvou dotazů udělá stovky a začne se plazit.
// ŠPATNĚ
$orders = Order::all();
foreach ($orders as $order) {
echo $order->customer->name; // dotaz navíc pokaždé
}
// LÉPE: eager loading
$orders = Order::with('customer')->get();
- Vztahy načítejte přes
with()předem. - Ke kontrole počtu dotazů používejte Laravel Debugbar.
- Výkonu se věnuji v článku o optimalizaci výkonu Laravel aplikace.
Tahle chyba je zákeřná právě tím, že se při vývoji na pár testovacích řádcích neprojeví. Všechno běží svižně, aplikaci pošlete do provozu a po pár měsících, když dat přibude, se začne plazit. Proto se vyplatí ji hlídat od začátku.
Konfigurace a verzování
Poslední skupina chyb je kolem nastavení a odevzdávání kódu. Drobnosti, které umí pořádně potrápit.
- Nikdy nepoužívejte
env()mimo konfigurační soubory — po cachování vrátínull. - Soubor
.envs hesly nepatří do Gitu. - Migrace používejte na každou změnu databáze, ne ruční zásahy.
Nechci ale strašit — nesnažte se od prvního dne psát dokonalý kód podle všech pouček. Důležitější je věci dokončovat a postupně se zlepšovat. Většina zásad, které tu zmiňuji, vám přejde do krve sama, jakmile jednou pocítíte, jak nepořádek bolí při další úpravě. Začínáte s Laravelem a chcete konzultaci? Napište mi na nezávaznou poptávku.