Mapping – moduly + viacero presenterov
- Creator13
- Člen | 18
Ahojte, nedari sa mi spojazdnit nasledovna funkcnost
Router
$router->withModule('Admin')
->addRoute('admin/test/', 'Test:default')
->addRoute('admin/test/add/', 'Test:TestAdd:default')
Application
application:
mapping:
*: [App\Module, * , *\*Presenter]
Presenters sa nachadzaju:
App\Module\Admin\Test\TestPresenter
App\Module\Admin\Test\TestAddPresenter
Templates sa nachadzaju:
App\Module\Admin\Test\templates\Test.default.latte
App\Module\Admin\Test\templates\TestAdd.default.latte
Routa admin/test/ mi najde presenter, ale routa admin/test/add/ mi nenajde presenter.
Routa admin/test/add/ mi funguje iba v pripade, ze ju mam v zlozke TestAdd
App\Module\Admin\TestAdd\TestAddPresenter
Je mozne mat viacero presenterov v zlozke Test? TestPresenter, TestAddPresenter, TestUpdatePresenter?
Viem, ze by som mohol mat viacer actions v presenteri TestPresenter, ale to nechcem.
Strukturu adresarov pre admin modul by som chcel mat vo finale nasledovnu:
App\Module\Admin\Blog\
App\Module\Admin\Category\
App\Module\Admin\Product\
Kazdy adresar by obsahoval viacero presenterov.
Diky za rady.
- m.brecher
- Generous Backer | 871
@Creator13
Je mozne mat viacero presenterov v zlozke Test? TestPresenter, TestAddPresenter, TestUpdatePresenter?
Jde to, nějak takhle:
application:
mapping:
*: ['App\Module', '*' , '*\*Presenter']
Test: ['App\Module\Test', '' , '\*Presenter']
$router->withModule('Test')
->addRoute('test/<presenter>[/<action>[/<id>]]',['action' => [Route::Value => 'default']]);
- Creator13
- Člen | 18
m.brecher napsal(a):
@Creator13
Je mozne mat viacero presenterov v zlozke Test? TestPresenter, TestAddPresenter, TestUpdatePresenter?
Jde to, nějak takhle:
application: mapping: *: ['App\Module', '*' , '*\*Presenter'] Test: ['App\Module\Test', '' , '\*Presenter']
$router->withModule('Test') ->addRoute('test/<presenter>[/<action>[/<id>]]',['action' => [Route::Value => 'default']]);
Vdaka za navedenie. Podarilo sa mi rozbehat takuto variantu:
$router->withModule('Admin')
->addRoute('admin/login/', 'Login:default')
->addRoute('admin/logout/', 'Login:logout')
->addRoute('admin/', 'Home:default');
$router->withModule('AdminTest')
->addRoute('admin/test/', 'Test:default')
->addRoute('admin/test/add/', 'TestAdd:default');
$router->withModule('AdminBlog')
->addRoute('admin/blog/add/', 'BlogAdd:default')
->addRoute('admin/blog/update/<articleId>/', 'BlogUpdate:default')
->addRoute('admin/blog/', 'Blog:default');
application:
mapping:
*: [App\Module, * , *\*Presenter]
AdminBlog: App\Module\Admin\Blog\*Presenter
AdminTest: App\Module\Admin\Test\*Presenter
Su tam cesty na zlepsenie, resp. zjednodusenie tohto zapisu?
Je moznost to vsetko udrzat pod modulom Admin?
- m.brecher
- Generous Backer | 871
Ahoj,
Já jsem po různém hledání nakonec dospěl k systému organizace presenterů a modulů takto:
- moduly v samostatných složkách v hlavní složce /Modules,
- presentery v podsložkách ve složkách modulu společně se všemi ostatními soubory, které presentery používají
- s výjimkou modelových tříd, ty mám stranou.
- každý modul má vstupní presenter Home
- šablony akcí presenterů mají prefix jména presenteru – pletly se mě šablony v různých presenterech
Velice podobný systém bude nyní podporovat Nette viz nedávný příspěvku na fóru https://forum.nette.org/…h-adresarich#…
v aktuální verzi Nette mapuji takto:
application:
mapping:
Front: ['App\Modules\Front', '', '*\*Presenter']
Admin: ['App\Modules\Admin', '', '*\*Presenter']
Stock: ['App\Modules\Stock', '', '*\*Presenter']
v příštích verzích Nette se to zjednoduší:
application:
mapping: App\Modules\*\**Presenter
adresářová struktura:
App
Model
PasswordModel.php
UserModel.php
StockBatchModel.php
Modules
Front
Home
HomePresenter.php
Home.default.latte
Sign
SignPresenter.php
Sign.default.latte
Password
PasswordPresenter.php
Password.default.latte
PasswordForm.php
Password.renew.latte
Admin
Home
HomePresenter.php
Home.default.latte
User
UserPresenter.php
User.default.latte
UserForm.php
User.create.latte
//...
Stock
Home
HomePresenter.php
Home.default.latte
StockBatch
StockBatchPresenter.php
StockBatch.default.latte
StockBatchForm.php
StockBatch.create.latte
Modul Front je vždy veřejně přístupný a zde umisťuji přihlašování popř. obnovu hesla – akce pro nepřihlášené uživatele. Ostatní moduly jsou zpravidla vždy pro přihlášené. Moduly takto mají stejnou autorizaci, což je přehledné a z hlediska bezpečnosti optimální.
Tento systém členění adresářů používám ve všech projektech stejný, nezanořuji moduly do sebe, ale v url je možné přidat nějaký sjednocující prefix.
Formuláře a komponenty nikdy neumisťuji dovnitř presenterů, ale vždy je mám jako samostatnou třídu v samostatném souboru. Potom jsou presentery jednoduché a není problém v presenteru použít větší počet komponent/formulářů.
Více presenterů v jednom adresáři ??
Doporučuji spíš jít cestou komponent, v adresáři presenteru mít vždy jen jeden presenter, který obsahuje více komponent a ty spouští v různých akcích. Tímto způsobem lze přirozeně seskupit funkce, které spolu souvisí a projekt je přehlednější a UI pro uživatele čitelnější.
Editoval m.brecher (18. 4. 12:12)
- Václav Pávek
- Backer | 100
@mbrecher a jak řešíš, kdy máš jednu komponentu použitou ve více presenterech?
- David Grudl
- Nette Core | 8227
@mbrecher základní strukturu mám podobnou, jen jména šablon neprefixuju, ono si s tím dobře poradí IDE (včetně hledání). To jsou taby v PhpStorm:
Moduly klidně zanořuju, pokud mám modul Blog, tak ho dělím na Front a Admin.
U pár projektů mi přirozeně vzniklo dělení podle domén, takže místo
presenterů Poll
v modulech Front
a
Admin
mám modul Poll
s presentery
Poll\Vote
(front) a Poll\Results
(admin).
Ještě jedna věc: mě vždycky vytáčela podobnost slov model
a modul
, protože místo Modules
používám
UI
:-)
- m.brecher
- Generous Backer | 871
@VáclavPávek
jak řešíš, kdy máš jednu komponentu použitou ve více presenterech?
To není moc časté, ale stává se to, potom pokud je komponenta použitá ve 2 presenterech tak jeden presenter je pro komponentu domovský, tam je umístěná a druhý si ji „půjčí“ ze sousedního presenter adresáře. Pokud je komponenta použitá častěji, tak ji umístím do App/Components, kde jsou komponenty používané napříč aplikací a komponenty pro layout (BasePresenter).