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.