Routy z databáze vč. statických rout

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

Obracím se na Vás s prosbou jak správně udělat následující routy

<?php

namespace App;

use \Nette\Application\Routers\Route,
    \Nette\Application\Routers\RouteList;

/**
 * Router factory.
 */
class RouterFactory {

    /** @var \Tirus\Repository\RouterRepository * */
    private $routerRepository;

    public function __construct(\Tirus\Repository\RouterRepository $rr) {
        $this->routerRepository = $rr;
    }

    /**
     * @return \Nette\Application\IRouter
     */
    public function createRouter() {
        $router = new RouteList();
        $prefix = '';
        $suffix = '';
        $list = glob(__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '*Module');
        foreach ($list as $modul) {
            if (class_exists('\\Tirus\\' . basename($modul) . '\\Router')) {
                eval('$router = \\Tirus\\' . basename($modul) . '\\Router::createRoutes($router,$prefix,$suffix);');
            }
        }
        $router[] = $frontModule = new RouteList('Front');
        foreach ($this->routerRepository->findByModule('Front') as $rr) {
            $frontModule[] = new Route($rr->slug, array('presenter' => $rr->presenter, 'action' => $rr->action, 'id' => $rr->paramId));
        }
        $frontModule[] = new Route('activation/<id>', array(
            'presenter' => 'Account',
            'action' => 'activation',
            'id' => NULL,
        ));
        $frontModule[] = new Route('Attachment/<uri>.<ext>', array(
            'presenter' => 'Attachment',
            'action' => 'viewext',
            'uri' => NULL,
            'ext' => null,
        ));
        $frontModule[] = new Route('humans.txt', array(
            'presenter' => 'Homepage',
            'action' => 'humanstxt',
            'id' => NULL,
        ));
        $frontModule[] = new Route('<presenter>/<action>/<id>[/<title>]', array(
            'presenter' => 'Homepage',
            'action' => 'default',
            'id' => NULL,
        ));
        $frontModule[] = new Route('index.php', 'Front:Default:default', Route::ONE_WAY);
        return $router;
    }

}


<?php

namespace Tirus\AdminModule;

use \Nette\Application\Routers\RouteList,
    \Nette\Application\Routers\Route;

class Router {

    static function createRoutes($router, $prefix = null, $suffix = null) {
        $router[] = $adminModule = new RouteList('Admin');
        $prefix = '';
        $suffix = '';
        $list = glob(__DIR__ . DIRECTORY_SEPARATOR . '*Module');
        foreach ($list as $modul) {
            if (class_exists('\\Tirus\\AdminModule\\' . basename($modul) . '\\Router')) {
                eval('$adminModule = \\Tirus\\AdminModule\\' . basename($modul) . '\\Router::createRoutes($adminModule,$prefix,$suffix);');
            }
        }

        $adminModule[] = new Route('Administration/navigations/<id>', array(
            'presenter' => 'Navigation',
            'action' => 'default',
            'id' => NULL,
        ));
        $adminModule[] = new Route('Administration/<presenter>/<action>/<id>', array(
            'action' => 'default',
            'presenter' =>  'Homepage',
            'id' => NULL,
        ));
        return $router;
    }

}

Ten eval co tam je, bych nahradil například routy z DB a nebo např. jak mi bylo již porazeno Flame/modules Ale jak nahradit tu část kde routy načítám z DB? Příjde mi hloupost si je všechny načíst z DB. Když si vemu, že tma může být klidně milion rout

Má tu někdo zkušenosti s tím Flame/Modules? Nějak se v tom dost ztrácím

David Matějka
Moderator | 6445
+
0
-

1. eval je zbytecna prasarna, muzes pouzit treba tohle

$route = call_user_func_array(array($className, 'createRoutes'), array($router, $prefix, $suffix));

2. udelej si vlastni databazovy router, viz https://github.com/…outerExample,


edit:
nebo proste pouzij masku routy <slug> a pridej si tam globalni FILTER_IN a FILTER_OUT, viz en doc (trochu niz to tam je, „global filters“)

Editoval matej21 (23. 9. 2014 22:30)

Tirus91
Člen | 199
+
0
-

@matej21
k tomu evalu, jsem dobře pochopil. To hned upravím a vyzkouším.

ale zbytek? jsem dost mimo mísu

Já to nyní provádím takto (i když to tu @DavidGrudl „pomlouval“, kvůli zbytečným dotazům)

mám tabulku kde je slug a k němu příslušný presenter, action a ID

Když chci vygenerovat URL, tak dělám něco takovéhoto {plink :Front:Articles:view $article->id} Mám aplikaci, která nyní má 3 moduly, z toho např. galerie, má administraci způsobem, že je submodulem modulu administrace.

Příklad https://github.com/…outerExample mi je jasnějšší než en doc , ale i tak trochu stejně nejasný. Prosím vysvětlil bys mi jak to funguje, nebo mne odkázal někam, kde to je vysvětlené?

-- edit
v metodě match() není řešen modul, jak ho tam mohu vyřešit?

-- edit2
co koukám, v tom příkladu je slug ke každé entitě (to jsem dřív také měl – takže bych to vrátil. měl jsem to pojmenovaní jen jako URI).. ale k čemu je tam samotná tabulka slugs?

Editoval Tirus91 (23. 9. 2014 23:32)