Mapping – moduly + viacero presenterov

Creator13
Člen | 18
+
0
-

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

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

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

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

@mbrecher a jak řešíš, kdy máš jednu komponentu použitou ve více presenterech?

David Grudl
Nette Core | 8227
+
+3
-

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

@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).

m.brecher
Generous Backer | 871
+
0
-

@DavidGrudl

jména šablon neprefixuju

Zkoušel jsem to, protože mě ty prefixy také štvou, ale když je otevřen jeden default.latte, tak IDE prefix adresáře do tabu nepřidá a já mám problém.