problem s mapping-om na admin a front
- stewestw
- Člen | 42
Zdravim, chcel by som vas poprosit o pomoc. pokusam sa urobit male CMS, kde by som chcel mat strukturu suborov:
- app
- – admin
- – – loginModule
- – – productModule
- – front
- – – productModule
…
snazim sa nastavit mapping cez config.neon:
mapping:
Admin: Admin\*Module\Presenters\*Presenter
front: Front\*Module\Presenters\*Presenter
ale bohuzial ma neroutuje do spravnych modulov
router mam v bootstrap.php nasledovne:
//new router rule
$router = $container->getService('router');
$router[] = $adminSubRouter = new RouteList('Product');
$adminSubRouter[] = new Route('admin/product/<presenter>/<action>', 'Product:default');
$router[] = $adminRouter = new RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Login:default');
prosim o pomoc s mappingom.
dakujem za pomoc.
- Filip Klimeš
- Nette Blogger | 156
Myslím, že správně by měly být moduly admin a front a struktura by měla vypadat spíš takhle:
-app
- AdminModule
- LoginPresenter
- ProductPresenter
- FrontModule
- ProductPresenter
v configu pak
mapping:
*: App\*Module\Presenters\*Presenter
a v routeru
new Route('<module>/<presenter>/<action>');
- stewestw
- Člen | 42
dakujem @FilipKlimeš , toto som mal povodne, len som to chcel mat viac strukturovane, aby som mal ako samostatne moduly napr productModule pre admin a pre front a nasledne ich doplnal ako balicky(moduly) a nie ako presentery. je mozne to neako upravit?
Editoval stewestw (24. 1. 2015 11:51)
- Filip Klimeš
- Nette Blogger | 156
Aha, takhle. A jaký je přesně problém s routováním?
EDIT: možná by šlo udělat
$adminSubRouter[] = new Route('admin/product/<presenter>/<action>', array('module' => 'Admin:Product', 'presenter' => 'default'));
Editoval FilipKlimeš (24. 1. 2015 12:28)
- greeny
- Člen | 405
Pozor, nezaměňovat adresáře a namespace.
Adresáře
Na adresářové struktuře na 99% vůbec nezáleží, např. app/ewifurweoifju/fsdpiucsoi/LoginPresenter.php je naprosto validní umístění presenteru. Nette si ho dokáže dohledat (RobotLoader), pokud má daný presenter správně namespace a aplikace má dobře nastavený mapping.
Mapping
V mappingu uvedeš mapování modulů na namespaces, např.:
mapping:
SomeModule: App\*Module\Presenters\*Presenter
AwesomeModule: My\Awesome\App\*Module\*Presenter
Nebo v případě, že máš mapping všude stejnej:
mapping:
*: App\*Module\Presenters\*Presenter
Namespaces
Na namespace vpodstatě nezáleží, opět je možné použít <?php namespace Abc\Def\Eijwofijsodh\WtfModule ?>, ovšem mapping je potřeba upravit tak, aby s tímto namespacem seděl.
Routing
Pokud v routě dáváš jako defaultní parametry modul, který je
vnořený, je potřeba to zapsat Prvni:Druhy
notací (výsledek →
PrvniModule\DruhyModule). V případě že to nepředáváš jako pole, ale
jako string, tak např.: Prvni:Druhy:Homepage:default
Můj názor na tvou strukturu: přijde mi zbytečně komplikovaná. Zanořené moduly už jsou potřeba jen u hodně složitých aplikací. Jedna modulová vrstva + presenter + akce by měla v 99% případů stačit.
- stewestw
- Člen | 42
Dakujem,
nakoniec som to este raz nahodil cele a na strukturu ako mi radi
@Mysteria. Upravil som router nasledne a zbehlo mi to:)
struktura:
- AdminModule
- - LoginModule
- - ProductModule
- FrontModule
- - ....
....
uprava v config.neon (mapping som vratil na povodny)
mapping:
*: App\*Module\Presenters\*Presenter
uprava v routeri(hlavna zmena, kde som asi robil chybu):
$router = $container->getService('router');
/*namiesto $router[] = $adminSubRouter = new RouteList('Login');*/
$router[] = $adminSubRouter = new RouteList('Admin:Login');
$adminSubRouter[] = new Route('admin/product/<presenter>/<action>','Login:default');
Dakujem vam velmi pekne za pomoc :)