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
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í?
- Mikulas Dite
- Člen | 756
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
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é.