Mapování samostatných presenterů

m.brecher
Generous Backer | 774
+
0
-

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 | 1184
+
0
-

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 | 774
+
0
-

@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 | 1184
+
0
-

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 | 774
+
0
-

@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)