Fabien Potencier pred nedávnom prestavil oficiálne Best Practises pre Symfony. Jedná sa o niekoľko doporučení ktoré vývojárom uľahčia prácu a držia sa pragmatickej filozofie celého frameworku.
Hneď v prvej kapitole je vysvetlená štruktúra aplikácie postavenej na Symfony. Táto štruktúra je v podstate od verzie 2.0 rovnaká (aj keď sa o jej zmene už diskutovalo) a všetkým ktorým prišlo Symfony pod ruky známa.
S jednou drobnou zmenou, ale v best practices prišli – a tou je štruktúra zložky src/
. Donedávna bola preferovaná štruktúra src/Acme/BlogBundle
alebo ukecanejšia src/Acme/Bundle/BlogBundle
, ktorá pripomínala Java svet. V best practices je tak trochu alibisticky uvedené, že vývojári to zle pochopili, keď na každú featuru vytvárajú vlastný bundle (UserBundle
, ProductBundle
, InvoiceBundle
…). To, že to tak bolo na každom mieste v dokumentácii, návodoch, demo aplikácii atď. nie je zmienené. Vo výsledku tak aplikácia vyzerala takto:
demo/
├─ app/
├─ src/
│ └─ Acme/
│ ├─ ProductBundle/
│ │ ├─ Controller/
│ │ │ └─ ProductController.php
│ │ └─ Resources/
│ │ ├─ views/
│ │ │ └─ Product/
│ │ │ ├─ list.html.twig
│ │ │ └─ view.html.twig
│ │ │
│ │ ├─ translations/
│ │ │ ├─ messages.sk.yml
│ │ │ └─ messages.en.yml
│ │ │
│ │ ├─ config/
│ │ │ └─ services.yml
│ │ │
│ │ └─ public/
│ │ ├─ css/
│ │ └─ js/
│ │
│ └─ InvoiceBundle/
│ ├─ Controller/
│ │ └─ InvoiceController.php
│ └─ Resources/
│ └─ views/
│ └─ Invoice/
│ ├─ list.html.twig
│ └─ view.html.twig
│
├─ vendor/
└─ web/
Teraz je konečne zdôraznené, že bundle je niečo, čo je znovupoužiteľné tak ako to je – bez dodatočných úprav. A že vôbec nie je potreba vytvárať štruktúru s vendor prefixom. V zložke src/
je tak iba jeden AppBundle (situácia väčšiny programátorov) a obsahuje Symfony-špecifický kód pre konkrétnu aplikáciu – controllery, routy, Doctrine entity, formuláre…. Šablóny, preklady a v podstate väčšina obsahu zložky src/AcmeBundle/Resources/
sa presunuly do zložky app/Resources
. Takže výsledná štruktúra:
demo/
├─ app/
│ ├─ config/
│ │ └─ services.yml
│ └─ Resources/
│ ├─ views/
│ │ ├─ Product/
│ │ │ ├─ list.html.twig
│ │ │ └─ view.html.twig
│ │ └─ Invoice/
│ │ ├─ list.html.twig
│ │ └─ view.html.twig
│ └─ translations/
│ ├─ messages.sk.yml
│ └─ messages.en.yml
├─ src/
│ └─ AppBundle/
│ └─ Controller/
│ ├─ ProductController.php
│ └─ InvoiceController.php
│
├─ vendor/
└─ web/
├─ css/
└─ js/
Všetky controllery, šablóny, štýlopisy a javascripty sú spolu a na svojom mieste. Je to prehľadnejšie a ľahšie sa v tom orientuje a udržiava poriadok. Tak som si upratal v zdrojákoch tohoto blogu aj ja :-).