Databazové připojení v ROUTě
- fojta
- Člen | 24
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
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
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 Configurator
em 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)
- Filip Procházka
- Moderator | 4668
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 Container
u.
Editoval HosipLan (24. 7. 2011 16:01)
- awsickness
- Člen | 98
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.