Použití Nette/DI samostatně

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

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

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

@tigercz Čeho chceš přesně docílit? Lazy Services ze Symfony\DependencyInjection?

tigercz
Člen | 14
+
0
-

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

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

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

Cílem je úplně nejjednodušší DI kontejner

Tak v tom případě asi hledáš Pimple.