DI nezavisle a registracia cez neon

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

Caute, mam appku v ktorej by som chcel pouzit DI nezavisle.

  1. je to mozne? (ako?)
  2. da sa to realizovat ako v nette ze si sluzby a parametre budem registrovat cez neon? (ako?)
David Grudl
Nette Core | 8172
+
+1
-

Nějak takto si vygeneruješ kontejner (vyžaduje nette/di 2.3-beta a je možné, že v 2.3 final to bude ještě malinko jinak).

(Doplnění: v nové verzi je to jinak)

	$classLoader = new Nette\DI\ContainerLoader(__DIR__ . '/temp'); // cesta k tempu

	$className = $classLoader->load('', function($className) {
		$loader = new Nette\DI\Config\Loader;
		$config = $loader->load('config.neon'); // cesta k config.neon

		$compiler = new Nette\DI\Compiler;
		//$compiler->addExtension($name, ....); // možnost přidat extensions
		$code = $compiler->compile($config, $className);
		$deps = array_merge(
			$loader->getDependencies(),
			$compiler->getContainerBuilder()->getDependencies()
		);

		return array($code, $deps);
	});

vytvoříš instanci:

$container = new $className;

a klasicky ho používáš:

$foo = $container->getService('foo');
duskohu
Člen | 778
+
0
-

Hmm, dakujem, a takto pojde aj ragistrovat sluzby cez neon?

David Grudl
Nette Core | 8172
+
0
-

Jasně, v config.neon normálně dáš:

services:
	foo: MyService
duskohu
Člen | 778
+
0
-

:-D, parada, posledna ot. chcel by som este pridat Tracy, a moznost panelu SystemContainer, toto asi uz nepojde, ci?

David Grudl
Nette Core | 8172
+
+1
-

Jde všechno. Bude to chtít přidat extensions:

$compiler->addExtension('di', new Nette\DI\Extensions\DIExtension(true));
$compiler->addExtension('tracy', new Tracy\Bridges\Nette\TracyExtension(true));

a v configu povolit:

di:
	debugger: yes
David Grudl
Nette Core | 8172
+
0
-

Ale opakuji, takhle to funguje v 2.3-beta, ve final to může být ještě trošku jinak.

David Grudl
Nette Core | 8172
+
+1
-

V aktuální 2.3.0-RC se to udělá takto:

	$classLoader = new Nette\DI\ContainerLoader(__DIR__ . '/temp'); // cesta k tempu

	$className = $classLoader->load('', function($compiler) {
		$compiler->loadConfig('config.neon'); // cesta k config.neon
		//$compiler->addExtension($name, ....); // možnost přidat extensions
	});
duskohu
Člen | 778
+
0
-

David Grudl napsal(a):

V aktuální 2.3.0-RC se to udělá takto:

	$classLoader = new Nette\DI\ContainerLoader(__DIR__ . '/temp'); // cesta k tempu

	$className = $classLoader->load('', function($compiler) {
		$compiler->loadConfig('config.neon'); // cesta k config.neon
		//$compiler->addExtension($name, ....); // možnost přidat extensions
	});

Skvele, dakujem :-)