Nette 2.3 a automaticky registrované presentery v DIC
- Oli
- Člen | 1215
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í:
- 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)
- 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?
- Někde v neonu nastavit, tenhle konkrétní presenter přeskoč (tenhle konkrétní soubor). Tohle jde nějak?
- Nějakej jinej nápad? :-)
- Jan Tvrdík
- Nette guru | 2595
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
@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)
- Oli
- Člen | 1215
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.