kolize dvou stejnojmenných tříd v dvou modulech

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

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

Ano, v php 5.2 se používají prefixy. V php 5.3 používej namespaces.
tzn
namespace FrontModule;
class x{}

nanuqcz
Člen | 822
+
0
-

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

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.

Aurielle
Člen | 1281
+
0
-

public $oldModuleMode = FALSE; platí pouze pro Nette verze 0.9.x.