Routing – Ako na rounting po zmene štruktúry priečinkov

KristianSubweb
Člen | 144
+
0
-

Ahojte mám celkom ošemetný problém. Aktuálne má projekt nasledovnú štruktúru priečinkov.

  • App
  • – AdminModule
  • – – DefaultModule
  • – – – Model
  • – – – – Extension
  • – – – – – DefaultModuleExtension
  • – – Moduls
  • – – – DashboardModule
  • – – – – Model
  • – – – – – Extension
  • – – – – – – DashboardModule

DefaultModuleExtension.php extenduje každý jeden modul v priečinku Moduls. Každý Modul má svoj vlastný súbor napr. DashboardExtension.php tento súbor sa potom ďalej registruje normálne ako extension.

DefaultModuleExtension.php rieši dynamické vytváranie rutovania pre každý modul zvlásť vytvorí s názvu php súboru rutu.

<?php

namespace DefaultModuleModule\Extension;

use Nette\DI\CompilerExtension,
    Kdyby\Doctrine\DI\IEntityProvider,
    Nette\Application\Routers\RouteList,
    Nette\Application\Routers\Route,
    Nette\Utils\Strings,
    Nette\Reflection\ClassType;

abstract class DefaultModuleExtension extends CompilerExtension implements IEntityProvider {

    /**
     * If module has route or no
     * @var boolean
     */
    protected $hasRoute = TRUE;

    /**
     * If modul has entities
     * @var boolean
     */
    protected $hasEntities = TRUE;

    /**
     * Modul name
     * @var string
     */
    protected $moduleName;

    public function __construct() {
        $reflection = new ClassType($this);

        $moduleName = str_replace("Extension", "", $reflection->getShortName());
        $this->setModuleName($moduleName);
    }

    // we need to register entities here for whole modul
    public function getEntityMappings() {
        // we set properties from config
        $this->setProperties();

        $mapping = [];
        if ($this->getHasEntities()) {
            $modulesDirectory = $this->getContainerBuilder()->parameters["modulesDir"];
            $mapping[$this->getModuleName() . 'Module'] = $modulesDirectory . "/".$this->getModuleName()."Module/model/Entities";
        }

        return $mapping;
    }

    public function loadConfiguration() {
        $smallModuleName = Strings::lower($this->getModuleName());

        if ($this->getHasRoute()) {
            $this->appendRouteList('Admin:'.$this->getModuleName(), '[<locale=sk sk|en>/]admin/'.$smallModuleName.'/<presenter>/<action>[/<id>]', $this->getModuleName().':default');
            $this->appendRouteList('Admin:'.$this->getModuleName(), '[<locale=sk sk|en>/]admin/'.$smallModuleName.'/<action>[/<id>]', $this->getModuleName().':default');
        }
    }

    /**
     * Inserts route list to current router
     * @param type $routelist
     * @param type $routemask
     * @param type $destination
     */
    protected function appendRouteList($routelist, $routemask, $destination) {

        $newRouteList = new RouteList($routelist);
        $newRoute = new Route($routemask, $destination);
        $newRouteList[] = $newRoute;

        $builder = $this->getContainerBuilder();
        $builder->parameters["createdRoutes"][] = $newRouteList;
    }

    protected function setProperties() {

        $config = $this->compiler->getConfig();
        $extensionName = $this->name;
        if (array_key_exists($extensionName, $config)) {

            foreach ($config[$extensionName] as $name => $value) {
                $this->$name = $value;
            }

        }
    }

    public function getHasRoute() {
            return $this->hasRoute;
    }

    public function getHasEntities() {
            return $this->hasEntities;
    }

    public function getModuleName() {
            return $this->moduleName;
    }

    public function setHasRoute($hasRoute) {
            $this->hasRoute = $hasRoute;
    }

    public function setHasEntities($hasEntities) {
            $this->hasEntities = $hasEntities;
    }

    public function setModuleName($moduleName) {
            $this->moduleName = $moduleName;
    }

}

DashboardExtension.php súbor pre modul Dashboard. Tento má ako jediný modul v sebe aj rozšírenie routovania nad rámec toho generovaného kvôli login.latte

<?php

declare(strict_types=1);

namespace App\AdminModule\DashboardModule\Model\Extension;

use App\AdminModule\DefaultModule\Model\Extension\DefaultModuleExtension;

final class DashboardExtension extends DefaultModuleExtension
{

    public function loadConfiguration()
    {
        parent::loadConfiguration();
        $this->appendRouteList("Admin:Dashboard", '[<locale=sk sk|en>/]admin/login[/<token>][/<id>]', "Dashboard:login");
        $this->appendRouteList("Admin:Dashboard", '[<locale=en sk|en|de|cs>/]admin/', "Dashboard:default");
    }

}

A tu vzniká nasledovný problém všetky odkazy potom musim riešiť celkom hlupo.

Pridal som modul ProjectModule a keď chcem vytvoriť odkaz tak to vyzerá nasledovne:

:Admin:Project:Project:default

Tu vznikne problém v tom priečinkovom systéme a presenter hlada so zlov path:
Invalid link: Cannot load presenter ‚Admin:Project:Project‘, class ‚App\AdminModule\ProjectModule\Presenters\ProjectPresenter‘

Lenže tá url by mala vyzerať App\AdminModule\ Moduls \ProjectModule\Presenters\ProjectPresenter

Ideálne by sa mi páčilo keby môžem skladať url nasledovne:
Project:default

Ďakujem za vaše odpovede :)

Václav Pávek
Backer | 97
+
0
-

Ahoj, zkus mrknout na https://github.com/…nter-mapping

KristianSubweb
Člen | 144
+
0
-

Václav Pávek napsal(a):

Ahoj, zkus mrknout na https://github.com/…nter-mapping

Oooo ďakujem idem to implementovať ešte raz ďakujem :)

Václav Pávek
Backer | 97
+
+1
-

@KristianSubweb přečetl jsem si požadavek ještě jednou, ty potřebuješ jen změnu namespace takže mrkni na článek https://f3l1x.io/…-presenteru/

KristianSubweb
Člen | 144
+
0
-

Václav Pávek napsal(a):

@KristianSubweb přečetl jsem si požadavek ještě jednou, ty potřebuješ jen změnu namespace takže mrkni na článek https://f3l1x.io/…-presenteru/

Mal si pravdu bolo to v tom. Ale aj tak som rad že si poslal tú knižnicu na to mappovanie presentérov. Je to fajn Dikes :)