Nette 2.3 a automaticky registrované presentery v DIC

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Oli
Člen | 1215
+
0
-

Ahoj,
mám modulární aplikaci, kdy každý modul je zodpovědný za konkrétní oblast (články, uživatelé, galerie, …). Jednotlivé moduly jsou „nainstalovány“ tak, že se stáhnou composerem a nalinkují do extensions. Každý modul má i vlastní presentery, který obsahují všechno, co je potřeba aby v základu ten který modul uměl. V sandboxu mám vsechny kostry modulů abych je nemusel psát znovu a tady je problém.

Například, když nemám v projektu gallery modul, tak tam vubec fyzicky není a tím pádem tam není ani ten presenter modulu. Protože se ale do DIC presenter snaží vytvořit, tak se snaží volat i neexistujícího předka.

Adresářovou strukturu mám:

- app
	- AdminModule
		- ArticleModule
			- presenters
			- templates
		- UserModule
	- FrontendModule
		- ArticleModule
		- UserModule

V presenteru to potom typicky vypadá takhle:

namespace App\GalleryModule\AdminModule\Presenters;

class HomepagePresenter extends HomepageDefaultPresenter
{

}

Problém je, že ten HomepageDefaultPresenter neexistuje.

Jde tohle nějak řešit? Napadá mě nělik možností:

  1. Vždy mít ve vendor všechny moduly, který jsou v kostře (to se mě moc nechce, ale pokud to jinak nepůjde tak to tak budu muset udělat)
  2. Kontrolovat někde, jestli třída existuje, jestli neexistuje tak použít jako předka např FrontendPresenter (ze kterého dědí všechny presentery na frontendu). Jde to nějak?
  3. Někde v neonu nastavit, tenhle konkrétní presenter přeskoč (tenhle konkrétní soubor). Tohle jde nějak?
  4. Nějakej jinej nápad? :-)
akadlec
Člen | 1326
+
+2
-

zřejmě to trochu mixuješ. Pokud ti nějaký modul závisí na jiném modulu tak by jej logicky měl vyžadovat.

Jan Tvrdík
Nette guru | 2595
+
0
-

Nebo to celé chování můžeš vypnout a nic neměnit, mělo by (snad, netestováno) stačit uvést v configu:

application:
	scanDirs: []
	scanComposer: no
Oli
Člen | 1215
+
0
-

@akadlec no asi jsem se blbě vyjádřil. Ono to je spíš kvůli lenosti :-) moduly nezavisi na nicem, jen na tom sandboxu a v tom sandboxu je prave ta kostra, ktera vyzaduje HomepageDefaultPresenter. Řídí to router, kde je

if(class_exists('\Akkon\UserModule\GalleryRouter'))
{
	$router[] = \Akkon\UserModule\GalleryRouter::defaultAdminRoute();
}

takže když když modul není načtenej ve vendoru, tak pokus přijít na www/gallery vyhodí 404. To teď právě nejde.

@JanTvrdík Díky, to zítra zkusím. Moc se mě to nechce takhle používat defaultně, prtože jinak se mě presentery v DIC líbí (a ručně je tam nahrávat taky nechci :-)).

Uplně nejideálnější by bylo, kdyby vedle scanDirs: [] bylo něco jako skipDirs: [] ;-)


@JanTvrdík Ne, tohle nemá žádnej efekt (asi) :-)

Editoval Oli (5. 2. 2015 8:07)

akadlec
Člen | 1326
+
0
-

a HomePagePresenter je teda co? Řek bych že to máš špatně navrženo.

Oli
Člen | 1215
+
0
-

Ten je v sandboxu. Neměl by tam být, ale je tam abych ho nemusel přidávat, když se rozhodnu přidat modul. To je ten presenter, kterej má routu. Sám osobě neobsahuje nic (může obsahovat specifické funkcionality projektu) a dědí všechny default funkce z modulu (kterej se načítá composerem).

Moc se mě totiž nelíbí aby router hledal ve vendor složce, takže hledá standardně v app. Presentery v app nicméně nemají žádnou funkcionalitu (pokud není nějaká spešl) a všechnu si dědí z toho modulu ve vendor.