použití WebChemistry/router ve vlastní DI extension

Petr Parolek
Člen | 455
+
0
-

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)

Martk
Člen | 652
+
0
-

Vypadá to, že tam nemáš chybu. Nemáš v config.neon něco jako:

services:
	router: App\Router\RouterFactory::createRouter

to bych vymazal.

Petr Parolek
Člen | 455
+
0
-

nemám nic takového

Editoval ppar (6. 12. 2018 13:33)

Petr Parolek
Člen | 455
+
0
-

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
+
0
-

Vyřešeno, kdyby někdo potřeboval, napsal jsem řešení do readme https://github.com/…er/README.md

Petr Parolek
Člen | 455
+
0
-

Ahoj, super, teď jsem zjstil a otestoval, že vypadá, že WebChemistry/router je plně kompabilní s Nette 3 ez jakýkoliv úprav extension