Mapování samostatných presenterů
- m.brecher
- Generous Backer | 871
Ahoj,
Zkouším si přehledněji organizovat soubory presenterů, šablon, komponent, factory pro komponenty a trait. Jako nejpřehlednější mě pro projekt bez modulů přijde toto řešení:
app/Presenters/Feed/
FeedPresenter.php
FeedUpdateForm.php
FeedUpdateFormFactory.php
FeedUpdateForm.latte
FeedCreateForm.php
FeedCreateFormFactory.php
FeedCreateForm.latte
list.latte
create.latte
update.latte
/Card/
CardPresenter.php
CardForm.php
CardFormFactory.php
CardForm.latte
list.latte
create.latte
update.latte
.... atd ...
Aby uměl Nette presenter správně dohledat šablony akcí a layoutů, je potřeba přepsat příslušné metody Nette\Application\UI\Presenter, což není žádný problém.
Presentery a jejich jednoúčelové komponenty a šablony pak máme pěkně pohromadě v presenterových adresářích:
app/Presenters/Feed/
/Card/
.....
/User/
BasePresenter.php // abstraktní presentery v rootu složky Presenters
FrontPresenter.php
AdminPresenter.php
Mapování presenterů mám vyřešené takto:
application:
mapping:
*: ['App\Presenters', '', '*\*Presenter'] # no modules
Přehlednost bohužel narušují presentery, které nepatří do business logiky aplikace – typicky ErrorPresenter a několik Error4xxPresenterů. Ty bych rád namapoval do jedné společné složky /Error takto:
app/Presenters/Error/
ErrorPresenter.php
FrontError4xxPresenter.php
AdminError4xxPresenter.php
4xx.latte
500.latte
Potřeboval bych tedy mapovat jednotlivé presentery samostatně, třeba nějak takhle:
application:
mapping:
*: ['App\Presenters', '', '*\*Presenter'] # common rule
Error: ['App\Presenters', '', '*\*Presenter']
FrontError4xx: ['App\Presenters', '', '*\*Presenter']
AdminError4xx: ['App\Presenters', '', '*\*Presenter']
Dokumentace Nette neuvádí žádnou takovou možnost tak předpokládám, že by se na to použilo nějaké extension pro Application ?? Napsat si vlastní PresenterFactory ??
Díky předem za jakékoliv rady a tipy jak tohle vyřešit.
Editoval m.brecher (8. 10. 2023 15:36)
- Marek Bartoš
- Nette Blogger | 1274
Mapování konkrétních presenterů se dá udělat a mám ho udělané tady (není to stable release, takže dokumentace trochu pokulhává, ale funguje to) To ale imho vůbec nepotřebuješ – je to zamýšlené spíš pro přetěžování presenterů.
Tobě by stačil mapping, který kopíruje namespace
1:1 *: ['', *, *\*Presenter]
Editoval Marek Bartoš (9. 10. 2023 16:40)
- m.brecher
- Generous Backer | 871
@MarekBartoš
Tobě by stačil mapping, který kopíruje namespace 1:1 *: ['', *, *\*Presenter]
Díky za tip.
Mapping 1 : 1 jak navrhuješ ale seskupí presentery do podsložky pomocí nového modulu. Já potřebuji mít možnost ve složce jednoho modulu umístit presentery obecným pravidlem do složek samostatně 1 : 1 (presenter : složka), a pomocí specifického pravidla některé presentery seskupit do jedné společné podsložky, ale neměnit modul, modul bude buďto žádný, nebo společný.
Je to analogie jako když máš obrázky ve složce /css/images, ale jedna skupina obrázků, která je specifická se umístí do samostatné podsložky /css/images/icons, aby se soubory zpřehlednily .
Editoval m.brecher (9. 10. 2023 17:54)
- Marek Bartoš
- Nette Blogger | 1274
Moduly nepotřebuješ, zapomeň na to že Nette moduly existují.
Routy si rozepíšeš pro jednotlivé presentery, místo modulu v kódu
můžeš kontrolovat společný interface nebo předka.
A App:Feature:Foo
se ti přemapuje na
App\Feature\Foo\FooPresenter
Případně s *: ['', *, *Presenter]
se ti přemapuje
na App\Feature\FooPresenter
- m.brecher
- Generous Backer | 871
@MarekBartoš
Routy si rozepíšeš pro jednotlivé presentery
Nejde o routy, jde o umístění souborů presenterů a jejich mapování, ještě to zopakuji:
Mapování mám pomocí obecného pravidla takto:
application:
mapping:
*: ['App\Presenters', '', '*\*Presenter']
no a potřeboval bych pro konkrétní presentery přidat specifická pravidla nějak takto:
application:
mapping:
*: ['App\Presenters', '', '*\*Presenter']
AdminError4xx: ['App\Presenters', '', 'Error\*Presenter'] # kde AdminError4xx je presenter
FrontError4xx: ['App\Presenters', '', 'Error\*Presenter'] # kde FrontError4xx je presenter
což v současném Nette nejde, protože se dají přidat specifická pravidla pouze pro jednotlivé moduly, nikoliv presentery.
Potom by názvy tříd presenterů byly následující:
App\Presenters\Error\ErrorPresenter
App\Presenters\Error\AdminError4xx
App\Presenters\Error\FrontError4xx
Teď mě napadlo, že když nedodržím PSR-4 doporučení pro adresářovou strukturu projektu, tak jednoduše soubory presenterů s názvy tříd mapovaných obecným pravidlem umístím do společného adresáře /Presenters/Error a mám to vyřešené :):
presenter:
App\Presenters\AdminError4xx\AdminError4xxPresenter
do souboru:
app/Presenters/Error/AdminError4xxPresenter.php
Lepší by ale bylo upravit mapování tak, aby se PSR-4 doporučení mohlo dodržet.
Teď to vypadá, že to nepůjde jinak, než nějakou úpravou v Nette Application, jenom nevím kudy začít + otázka zda to stojí za tu námahu.
Editoval m.brecher (9. 10. 2023 19:38)