Univerzální routování pro modul a submodul

před 11 měsíci

Raek
Člen | 4
+
0
-

Zdravím všechny příznivce Nette,

nějaký ten večer se snažím udělat univerzální router pro Nette aplikaci s architekturou, která obsabuje muduly a submoduly (ano, forum jsem pročetl důkladně před napsáním tohoto postu).

Mám napsaný router, který tak nějak funguje, ale nejsem si postupem vůbec jistý a proto bych se rád zeptal, jestli by mi někdo dokázal upřesnit chování rout anebo poradit, jak router udělat lépe. Cílem mého snažení je “univerzální router”, respektive aby to fungovalo tak, že ke každému modulu a submodulu nebudu muset psát zvlášť routy.

U níže vloženého routeru mám následující problémy:

  • Jak lépe vyřešit defaultní routy pro frontend / (www.neco.cz) a backend /admin (www.neco.cz/admin) než těmi defaultními routami?
  • Proč když odeberu od poslední definice routy (‘<module>/<presenter>/<action>[/<id>]’) flag Route::ONE_WAY, vždy dostanu přesměrování url z /page na admin/page?
  • nědělám to úplně blbě? Existuje lepší řešení například kompletně přes RouteList?

Architektura:

  • app
    • Modules
      • DefaultModule
        • AdminModule
          • presenters
        • FrontModule
      • PageModule
        • AdminModule
          • presenters
        • FrontModule
public static function createRouter()
    {
        $router = new RouteList;

        $router[] = $defaultRoutes = new RouteList('Default');
        $defaultRoutes[] = new Route('admin', [
            'module'    => 'Admin',
            'presenter' => 'Default',
            'action'    => 'default',
        ]);

        $defaultRoutes[] = new Route('', [
            'module'    => 'Front',
            'presenter' => 'Homepage',
            'action'    => 'default',
            Route::ONE_WAY,
        ]);

        $router[] = new Route('admin/<module>/<presenter>/<action>[/<id>]', [
            'module'    => array(
                Route::FILTER_IN  => function ($module) {
                    return ucfirst($module) . ':Admin';
                },
                Route::FILTER_OUT => function ($module) {
                    list($module) = explode(':', $module);

                    return strtolower($module);
                },
            ),
            'presenter' => 'Default',
            'action'    => 'default',
        ]);

        $router[] = new Route('<module>/<presenter>/<action>[/<id>]', [
            'module'    => array(
                Route::FILTER_IN  => function ($module) {
                    return ucfirst($module) . ':Front';
                },
                Route::FILTER_OUT => function ($module) {
                    list($module) = explode(':', $module);

                    return strtolower($module);
                },
            ),
            'presenter' => 'Default',
            'action'    => 'default',
            Route::ONE_WAY,
        ]);

        return $router;
    }

Předem děkuji za váš čas!