Elegantnější strukturování presenterů

před 8 měsíci od David Grudl  

Máte rádi pořádek a strukturu? Když je všechno přesně tam, kde má být, a snadno se v tom orientujete? Kdo by neměl. Nette Framework 3.2 přináší nový způsob, jak organizovat presentery a jejich šablony ve vaší aplikaci.

Nette nyní umožňuje každému presenteru mít svůj vlastní samostatný adresář. To znamená, že všechny soubory týkající se konkrétního presenteru, od PHP souborů až po šablony Latte, můžete mít pohromadě v jedné složce. To usnadňuje navigaci ve vašem projektu a zvyšuje přehlednost.

Představte si tuto strukturu:

├── @layout.latte
├── Home/
│   ├── HomePresenter.php
│   ├── HomeTemplate.php
│   └── default.latte
├── Article/
│   ├── ArticlePresenter.php
│   ├── ArticleTemplate.php
│   ├── add.latte
│   └── edit.latte

Každý presenter má svou složku a v ní vše potřebné. Už žádné zdlouhavé dohledávání šablon v podadresářích.

Jak to funguje?

Díky novému zástupnému znaku ** v mapování můžete definovat, že presenter má být v eponymní složce:

application:
    mapping: App\UI\*\**Presenter

Toto nastavení zajistí, že například presenter Admin:Dashboard se bude mapovat na třídu App\UI\Admin\Dashboard\DashboardPresenter.

A co šablony?

Pokud chcete nadále umísťovat šablony do samostatné složky jako dosud, nemusíte se ničeho obávat. Nette nyní inteligentně hledá šablony jak ve složce templates, tak ve složce s presenterem, a to pokud adresář templates neexistuje.

Podobně to funguje s @layout.latte. Pokud adresář templates neexistuje, hledá se nejprve ve složce presenteru a poté ve složkách nadřazených. A to až podle úrovně zanoření modulu.

Jak začít používat tuto novinku?

Stačí jen upravit mapování a přesunout soubory. V PhpStormu nad názvem třídy stisknete F6 a můžete změnit namespace. Soubory se šablonami je potřeba přesunout ručně.

Tato adresářová struktura se používá také ve skeletonu nette/web-project. Složkou, která obsahuje všechny presentery, jejich šablony a případné pomocné třídy, je App\UI. Není to obvyklé Module, protože takový název není příliš vypovídající a zároveň je hodně podobný používanému Model. Pokud uvažujete, kam zařadit různé další pomocné třídy, zvažte využití složky Accessory:

app/
├── UI/
│   ├── Accessory/
│   │   ├── FormFactory.php
│   │   └── AdminLayout.php
│   ├── Dashboard/
│   │   ├── DashboardPresenter.php
│   │   └── default.latte
│   └── ...

Tato metoda nejen zjednodušuje organizaci souborů, ale také je v souladu s moderními postupy kódování, protože činí strukturu aplikace modulárnější a snadněji udržovatelnou.

Komentáře

  1. Tak tohle se mi brutalne libi! Okamzite jsem to na aktualnim projektu poprehazel a ted je to uz uplne o necem jinem! Ted je to prehledne! Skvele! Diky!!

    před 8 měsíci
  2. Je to pěkné. Jen mě trochu dráždí, když už jsem se do toho úklidu dal, že se Accessory míchá s ostatními složkami + neměl jsem kam dát soubory s šablonami, které vkládám do hl. @layout.latte (je jich hodně na to je nechat ležet vedle). Prozatím jsem to vyřešil tím, že mám UI/_accessory a UI/_templates, ale něco mi říká, že úplně 100% to není. Nějaké nápady?

    před 8 měsíci · replied [6] NeonMind
  3. Tohle je super! 👏 Používám tuto „feature“ based strukturu v projektech a je to prostě efektivní.

    před 8 měsíci
  4. A pro single action prezenter takto?

    app/
    ├── UI/
    │ ├── Article/
    │ │ ├── ShowPresenter.php
    │ │ ├── AddPresenter.php
    │ │ ├── EditPresenter.php
    │ │ ├── templates/
    │ │ │ ├── Show/
    │ │ │ │ └── default.latte
    │ │ │ ├── Add/
    │ │ │ │ └── default.latte
    │ │ │ └── Edit/
    │ │ │ └── default.latte
    │ ├── Accessory/
    │ │ ├── FormFactory.php
    │ │ └── SomeHelperClass.php
    ├── Model/
    │ ├── Article.php
    │ └── ArticleRepository.php
    config/
    ├── common.neon
    ├── local.neon

    před 7 měsíci
  5. Co se nachází v těch HomeTemplate.php a ArticleTemplate.php?

    před 5 měsíci
  6. #2 micmar Taky mi nevoní míchání /Accessory s názvy presenterů. Podtržítko to řeší, ale tak nějak upatlaně. Ale jak to řešit lépe netuším.

    před 3 měsíci

Chcete-li odeslat komentář, přihlaste se