Lazy tvoření dedikovaných kontextů pro modely

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

Jak nejhezčeji tvořit nové kontexty lazy?

Majkl to v kuchařce https://pla.nette.org/…cy-injection dělá rovnou

final class ModelLoader {

public function __construct(Container $container)
{
        $modelContainer = new Container;
        $modelContainer->addService('database', $container->database);
        $modelContainer->freeze();
        $this->modelContainer = $modelContainer;
}

//...

Šlo by tam dát třeba

$modelContainer->addService('database', function() use ($container) {return $container->database;});

ale nemá pro to Nette\DI nějaké hezčí řešení?

mkoubik
Člen | 728
+
0
-

Můžeš podědit Nette\DI\Container a pak použít metodu createServiceDatabase().

Mikulas Dite
Člen | 756
+
0
-

Tak to rovnou můžu podědit a udělat si tu lambdu dynamicky. Každopádně dík, beru to jako potvrzení že Nette-way na to není.

Filip Procházka
Moderator | 4668
+
0
-

Nette-way (nebo spíše, takto se to dělá v Symfony a protože jste se jím všichni oháněli ukážu že to jde udělat i v nette way, řekl bych) je právě to podědění Containeru.

Určitou zkratkou je pak funkce ve vlastním „baseContaineru“.

class Container extends Nette\DI\Container
{

	/**
	 * @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);
		});
	}
}

Potom si služby zkopíruješ :)

final class ModelLoader {

public function __construct(Container $container)
{
        $modelContainer = new Container;
        $modelContainer->lazyCopy('database', $container);
        $modelContainer->freeze();
        $this->modelContainer = $modelContainer;
}

Když na to teď koukám, ještě mě napadá, že by to mohlo container přijímat už v konstruktoru, ale to by asi nebylo tak ohebné.