použití WebChemistry/router ve vlastní DI extension
- Petr Parolek
- Člen | 455
Ahoj,
začínám se učit vytvářet vlastní DI extension a netuším jak v ní přidat https://github.com/…istry/router .
<?php
namespace X\Y\DI;
use Kdyby\Doctrine\DI\IEntityProvider;
use Nette\DI\CompilerExtension;
use Nette\DI\Statement;
class YExtension extends CompilerExtension implements IEntityProvider
{
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$config = $this->loadFromFile(__DIR__ . '/config.neon');
$routerDef = $builder->addDefinition($this->prefix('routers'))
->setFactory(\X\Y\SomeRouter::class)
->setAutowired(true);
$this->compiler->loadDefinitions(
$builder,
$config['services'],
$this->name
);
foreach ($config['routers']['routers'] as $key => $router) {
$router = new Statement($router);
$routerDef->addSetup('add', [$router, $key]);
}
}
public function beforeCompile()
{
$builder = $this->getContainerBuilder();
$builder->getDefinition($builder->getByType(\Nette\Application\IPresenterFactory::class))
->addSetup(
'setMapping',
[['Y' => 'X\Y\Presenters\*Presenter']]
);
}
}
config.neon v extension
services:
...
routers:
routers:
- X\Y\SomeRouter
<?php
namespace X\Y;
use WebChemistry\Routing\IRouter;
use WebChemistry\Routing\RouteManager;
use Nette\Application\Routers\Route;
class SomeRouter implements IRouter
{
/**
* @param RouteManager $routeManager
*/
public function createRouter(RouteManager $routeManager): void
{
// Front
$app = $routeManager->getModule('Addressbook');
$app[] = new Route('[<locale=cs cs|en>/]some/<presenter>/<action>[/<id>]', 'Default:default');
//$routeManager->finish(); // Sub routers are not processed
}
}
?>
<?php
namespace App;
use WebChemistry\Routing\IRouter;
use WebChemistry\Routing\RouteManager;
use Nette\Application\Routers\Route;
class MainRouter implements IRouter
{
/**
* @param RouteManager $routeManager
*/
public function createRouter(RouteManager $routeManager): void
{
// Front
$app = $routeManager->getModule('App');
$app[] = new Route('[<locale=cs cs|en>/]<presenter>/<action>[/<id>]', 'Homepage:default');
//$routeManager->finish(); // Sub routers are not processed
}
}
?>
config.neon v app:
...
extensions:
routers: WebChemistry\Routing\DI\RouterExtension
routers:
main: App\MainRouter
...
Inspiroval jsem se zde: https://github.com/…xtension.php . Routery se mi nenačítají. Kde mám prosím chybu?
Editoval ppar (6. 12. 2018 11:36)
- Petr Parolek
- Člen | 455
posunul jsem se dál, @Martk mě nasměroval a dal jsem v extension do metody loadConfiguration:
$builder->addDefinition($this->prefix('routers'))
->addTag('router')
->setFactory(\TestPackage\Test\TestRouter::class)
->setAutowired(true);
Hlavní router je úplně první, ale má být poslední.
Prasácké řešení: https://github.com/…xtension.php#… a https://github.com/…ootstrap.php#…. Rád byxch mě čisté řešení přes DI extension.
- Petr Parolek
- Člen | 455
Vyřešeno, kdyby někdo potřeboval, napsal jsem řešení do readme https://github.com/…er/README.md
- Petr Parolek
- Člen | 455
Ahoj, super, teď jsem zjstil a otestoval, že vypadá, že
WebChemistry/router
je plně kompabilní s Nette 3 ez jakýkoliv
úprav extension