Sub-Container – jednoduche vytvorenie noveho containera
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Morlok
- Člen | 26
Nazdar nettaci, zaujimal by nazor na takuto triedicku:
<?php
class SubContainer extends \Nette\DI\Container
{
public function __construct(\Nette\DI\Container $context, array $serviceNames) {
foreach($serviceNames as $name) {
$this->addService($name, function() use ($context, $name) {
return $context->$name;
});
}
}
}
?>
a potom pouzitie:
<?php
// vybere z contextu sluzby uploader a priceRenderer a vytvori lazy loading sluzieb
$container = new \App\DI\SubContainer($context, array('uploader', 'priceRenderer'));
?>
// EDIT:
asi by bola lepsia nejak utilitka,
<?php
class SubContainer
{
public static function createFrom($context, array $serviceNames) {
$container = new Nette\DI\Container();
foreach($serviceNames as $name) {
$container->addService($name, function() use ($context, $name) {
return $context->$name;
});
}
return $container;
}
}
$container = SubContainer::createFrom($context, array('uploader', 'priceRenderer'));
?>
Editoval Morlok (11. 7. 2011 8:14)
- Filip Procházka
- Moderator | 4668
Mám něco podobného, jenom jsem si na tohle přidal metodu
/**
* @param string $name
* @param Nette\DI\IContainer $container
*/
public function lazyCopy($name, Nette\DI\IContainer $container)
{
$this->addService($name, function() use ($name, $container) {
return $container->getService($name);
});
}
a pak si to kopíruju po jednom :)
$container = $configurator->container;
$context->lazyCopy('session', $container);
$context->lazyCopy('httpRequest', $container);
Mě to stačí takto :) Ale pěkné :)