Nastavení vlastního routeru

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

Zdravím,
je nějak možné nastavit si vlastní třídu pro Router? Podle Configurator.php:306 (GIT verze z 13.5.2011) to tak nevypadá, RouteList vypadá, že je tam natvrdo, editací configu tím pádem taky ničeho nedosáhnu. Pokud ta možnost byla odstraněna, proč?
Díky.

Editoval Teyras (13. 5. 2011 22:19)

kravčo
Člen | 721
+
0
-

Pred pár dňami zmizla metóda setRouter(), ktorou to išlo.

V podstate to ale nie je nutné, pretože (a) $app->setRouter($myRouter); a (b) $app->router[] = $myRouter; by mali byť funkčne ekvivalentné. Rozdiel je v tom, že pri (a) routuje tvoj vlastný router a pri (b) routuje RouteList postupne routrami zo svojho zoznamu, ktorý obsahuje jednu položku – tvoj router.

Teyras
Člen | 81
+
0
-

Právě setRouter() jsem předtím používal. Každopádně obejít jak píšeš to jde, takže děkuju :)

Filip Procházka
Moderator | 4668
+
0
-

Neřekl bych, že „obcházení“ je vhodný výraz, protože router je přesně na tohle stavěný. Krapet nepříjemnější je, pokud má člověk vlastní router a instance RouteList mu přijde zbytečná :)

Teyras
Člen | 81
+
0
-

To je právě můj problém, proto by mě zajímalo, proč se všechny ostatní služby berou z contextu, jen tahle se tvoří natvrdo

Ondřej Mirtes
Člen | 1536
+
0
-

Tahle část frameworku zrovna teď prochází bouřlivým vývojem a tohle (doufám) není finální stav. Používání aktuálního masteru s sebou nese tahle rizika.

Filip Procházka
Moderator | 4668
+
0
-

Tak fajn, já to teda napíšu ještě jednou…

Vytvoříš si vlastní configurator

class MyConfigurator extends Nette\Configurator
{

	/**
	 * @return Nette\Application\Application
	 */
	public static function createApplication(DI\IContainer $container, array $options = NULL)
	{
		// stačí nahradit službu, její instance se ještě nevytvořila
		$application = parent::createApplication($container, $options);

		// nahradit router
		$application->context->removeService('router');
		$application->context->addService('router', 'MyÜberCoolRouter');

		return $application;
	}
}

Je vhodné nový configurator nastavit jako výchozí, protože si tam určitě budeš chtít přidat další továrničky. Soubor app/bootstrap.php

Environment::setConfigurator(new MyConfigurator);
Environment::loadConfig(); // ano správně, configurátor je potřeba nahradit, před načtením configu

Tak a teď si můžeš nastavit, aby se služby vytvářela novou továrničkou

common:
	...

	service:
		...
		application: MyConfigurator::createApplication
...

Voala, máš vlastní router v application

Teyras
Člen | 81
+
0
-

Myslel jsem si, že to bude možný… Dík ;)