Databazové připojení v ROUTě

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

Zdravím,
možná mám uplně blbý dotaz.
Pročítal jsem si zde celou sekci a pročetl jsem toho hodně o DI, modelLoaderu atak.
Ale ted bych potřeboval napsat si vlastní ROUTu a jde mě o to, že si v ní chci sahat do DB. V předešlé verzi NETTE, ve které jsem používal DIBI to bylo easy klasické statické volání. Jak na to u Routy při slpnění DI ?

Díky

Tharos
Člen | 1030
+
0
-

Pokud ta routa připojení k databázi vysloveně potřebuje, řešením „podle vzoru“ je předat té routě databázové připojení přes konstruktor. Tj. nevyhneš se definici vlastní třídy, která bude od Route pravděpodobně dědit a která bude v konstruktoru mimo běžných parametrů (masky atd.) vyžadovat i instanci nějakého databázového připojení.

Zvaž ale, jestli je tohle jako celek dobrá koncepce. Pokud potřebuješ routovat podle nějakých záznamů v databázi, standardním řešením je vlastní implementace IRouter či využití filtrů. Další alternativou je vytvoření nějaké třídy (která bude mít charakter jakéhosi „konfigurátoru“ či „builderu“), které na základě záznamů v databázi vygeneruje správně nakonfigurované instance Route.

Filip Procházka
Moderator | 4668
+
0
-

Osobně preferuju řešení, kdy si uděláš potomka Nette\Configurator a budeš si v něm dopisovat služby, které aplikace bezpodmínečně potřebuje.

use Nette\Application\Routers\RouteList;
use Nette\Application\Routers\Route;
use Nette\DI\Container;

class MyConfigurator extends Nette\Configurator
{

	/**
	 * @param Container $container
	 * @return Router
	 */
	public static function createServiceRouter(Container $container)
	{
		// službu connection je možné mít definovanou v configu,
		// protože router se vytváří lazy a v době jeho volání už bude načten config
		$db = $container->connection;

		$router = new RouteList();

		// provedeš si a nastavíš co potřebuješ
		$router[] = new Route($db->select('*')->from(...

		$router[] = new Route('/<module>/<presenter>/<action>', 'Homepage:default');

		return $router;
	}

}

Tímto Configuratorem si pak musíš v bootstrap.php nahradit ten od Nette

require_once LIBS_DIR . '/Nette/loader.php'; // načtu nette

// RobotLoader je vytvořen až Configuratorem, proto je nutné Configurator načíst "po staru"
require_once APP_DIR . '/models/MyConfigurator.php'; // načtu configurator

Nette\Debugging\Debugger::enable();

$configurator = new MyConfigurator();
$configurator->loadConfig(APP_DIR . '/config.neon');

// spustit aplikaci
$configurator->container->application->run();

Jediné co se mění tak místo Nette\Configurator použiješ MyConfigurator a pak v boostrap.php nenastavuješ router, protože už je nastaven v Configuratoru a výchozí továrnička na Application si ho převezme sama.

Editoval HosipLan (24. 7. 2011 12:10)

fojta
Člen | 24
+
0
-

HosipLan:
díky za vyčerpávající odpověd :)
A ta výchozí továrnička si už z toho MyConfiguráku sama převezme všechny createServise<nameservise> ?

Filip Procházka
Moderator | 4668
+
0
-

Ano, protože je to potomek původního Configuratoru, takže všechno zdědí. Ty jen přidáš vlastní službu :)

Původní Configurator totiž projde celou svou třídu a hledá metody createService<service> a ty pak volá a výsledek přidává do Containeru.

Editoval HosipLan (24. 7. 2011 16:01)

fojta
Člen | 24
+
0
-

Jasný :)
Ještě se zeptám, trošku off-topic. Jakej je rozdíl mezi vytvorenim servise ve vlastnim Configuratoru a zapsanim servise v config.neon ? Je to totožné, jenom rozdíl v zápisu a kdo na co je zvyklý ?

Filip Procházka
Moderator | 4668
+
0
-

Je to totožné.

lvq
Člen | 47
+
0
-

Omlouvam se, ze ozivuji stare vlakno, ale muj dotaz se tyka zde uvedeneho.
Pouzil jsem zpusob od HosipLana a vytvoril MyConfigurator. Vse uz funguje, jak ma, jen v booststrapu musim ted volat:

$container->router[] = $configurator->createServiceRouter($container);

Diky

awsickness
Člen | 98
+
0
-

ale to je spravne pokud chapu hospilanuv zapis tak jen vytvari a vraci ho. takze tak jak to mas ty je to spravne.
pokud by si to chtel jinak musel bys si v te service nejspise ziskat router a do nej to pridat.