Routing – Ako na rounting po zmene štruktúry priečinkov
- KristianSubweb
- Člen | 146
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 :)
- KristianSubweb
- Člen | 146
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 | 101
@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 | 146
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 :)