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

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

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é :)