Použití Nette/DI samostatně

- tigercz
 - Člen | 14
 
Ahoj všem, poradíte mi prosím jak použít Nette/DI, aby se instance vytvořila až ve chvíli, kdy zavolám getService()? Jel jsem podle návodu:
mkdir Test
cd Test
composer require nette/di
composer require tracy/tracy
touch index.php
index.php pak vypadá takto:
<?php
require_once 'vendor/autoload.php';
Tracy\Debugger::enable();
$container = new Nette\DI\Container;
$container->addService('connection', function() {
	return new Connection();
});
$connection = $container->getService('connection');
dump($connection->getTest());
vyhodí vyjímku:
Call to undefined method Closure::getTest()
Connection.php vypadá takto:
<?php
class Connection {
	function getTest()
	{
		return 'test';
	}
}
					Editoval tigercz (23. 5. 2015 14:48)

- Zax
 - Člen | 370
 
Předávání anonymní funkce v addService je myslím dokonce deprecated.
Co já vím, tak aby to šlo lazy, tak si prostě musíš kontejner podědit a přidat vlastní metody na vytváření instancí. Možná je i jiná a lepší cesta, ale zas tak podrobně to nemám prozkoumaný.
class MyDIContainer extends Nette\DI\Container {
	public function createServiceConnection() {
		return new Connection;
	}
}
require_once 'vendor/autoload.php';
Tracy\Debugger::enable();
$container = new MyDIContainer;
$connection = $container->getService('connection');
dump($connection->getTest());
Ale než se s tím takto vypisovat, to už máš podle mě fakt jednodušší když použiješ Nette\Configurator, který ti ten kód kontejneru vygeneruje z neonu ;-)

- Tomáš Votruba
 - Moderator | 1114
 
@tigercz Čeho chceš přesně docílit? Lazy Services ze Symfony\DependencyInjection?

- tigercz
 - Člen | 14
 
Díky za tip na Nette\Configurator! Nicméně ještě budu muset
přinutit generátor, aby mi vygeneroval pouze služby, které nadefinuju
samostatně. Aktuálně to generuje spoustu služeb navíc (cache.storage,
http.requestFactory, http.request, http.response, session.session, atd atd) a to
i přesto, že mám v config.neon pouze sekci
services.

- tigercz
 - Člen | 14
 
Díky za tip na Symfony\DI, už jsem to začal řešit přes
Laravel Container, tak možná zkusim ten Symfoní.
Cílem je úplně nejjednodušší DI kontejner, kde budu volat
addService() a getService() a bude to lazy.
Přes Nette\Configurator se mi to už povedlo rozchodit, ale přijde mi, že už je tam zadrátovaných až moc věcí kolem, které zatím nevyužiju.

- Tomáš Votruba
 - Moderator | 1114
 
K čemu konkrétně lazyness potřebuješ? Kolik výkonu to v tvém
případě ušetří?
Koukal jsem na nějaké testy a záleží hodně na velikosti aplikace.

- Jan Tvrdík
 - Nette guru | 2595
 
Cílem je úplně nejjednodušší DI kontejner
Tak v tom případě asi hledáš Pimple.