kolize dvou stejnojmenných tříd v dvou modulech
- jrwm
- Člen | 14
Ahoj,
chtěl jsem rozdělit moji aplikaci na dva moduly – frontend a backend. Ve
složce app jsem vytvořil dvě složky AdminModule a FrontModule, do nich
složky models, presenter a templates. V bootstrap.php jsem upravil
routy na
<?php
$router[] = new NRoute('index.php', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
), NRoute::ONE_WAY);
$router[] = new NRoute('Front/<presenter>/<action>/<id>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
$router[] = new NRoute('Admin/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Login',
'action' => 'default',
'id' => NULL,
));
?>
Jenže když aplikaci spustím, Laděnka mi hlásí Ambiguous class
‚commentsmodel‘ resolution. Tedy, že mám jednu třídu vícekrát. Opravdu
se musí každá třída v Nette frameworku jmenovat jinak? Nešlo by to nějak
obejít? Například budu mít CommentsPresenter i CommentsModel jak pro
frontend tak pro backend. Funkčnost budou mít odlišnou, ale názvy stejné.
Jen mi příjde hloupé, abych názvům tříd vymýšlel nějaké prefixy pro
odlišení, když už jsou odlišeny svou příslušností v modulu.
(používám Nette verzi 0.9 pro PHP 5.2 s prefixy)
- bojovyletoun
- Člen | 667
Ano, v php 5.2 se používají prefixy. V php 5.3 používej
namespaces.
tzn
namespace FrontModule;
class x{}
- nanuqcz
- Člen | 822
jrwm napsal(a):
Jen mi příjde hloupé, abych názvům tříd vymýšlel nějaké prefixy pro odlišení, když už jsou odlišeny svou příslušností v modulu.
(používám Nette verzi 0.9 pro PHP 5.2 s prefixy)
Ahoj, prefixy se jen tak nevymýšlí, jsou jasně dané:
class Front_CommentsPresenter{ //prefix 'Front_' pro třídy v FrontModule, prefix 'Admin_' pro AdminModule
...
}
Routy pak necháš tak jak je už máš a mělo by to fungovat. (u Nette pro PHP 5.3 se pak místo prefixů používají namespace, ale vidím že ty používáš Nette pro PHP 5.2, takže takhle)
- jrwm
- Člen | 14
xxxObiWan: Super, to mi pomohlo. Díky :)
Jen dodám pro ostatní začátečníky:
Abych mohl používat adresářovou strukturu, kterou jsem napsal výše (Ve
složce app jsem vytvořil dvě složky AdminModule a FrontModule, do nich
složky models, presenter a templates), musel jsem ještě do basepresenterů
doplnit
public $oldModuleMode = FALSE;
Jinak mě to nutilo do jiné adresářové struktury, která mi stejně nefungovala :D Hlásilo to, že nelze načíst {include #content}.
Pokud vám Laděnka bude hlásit, že nemůže nějaké části najít, zkuste vymazat cache ve složce temp a aplikaci spustit znovu.