Registrace vlastní PresenterFactory v Nette 2.3

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

Ahoj,

mám napsanou vlastní PresenterFactory, která dědí od Nette\Application\PresenterFactory. Problém je v tom, že nevím jak ji mám zaregistrovat v Neonu.

Když to napíšu takhle, tak se nepředají argumenty do konstrukotru.

services:
	nette.presenterFactory:
		class: App\Application\PresenterFactory

Musím to dělat takhle

services:
	nette.presenterFactory:
		class: App\Application\PresenterFactory
		arguments:
			- Nette\Bridges\ApplicationDI\PresenterFactoryCallback(..., 0, NULL)

Neví někdo jak to napsat, abych tam nemusel takhle předávat ten PresenterFactoryCallback ?

Šaman
Člen | 2635
+
0
-

Od boku – tohle nefunguje?

services:
    nette.presenterFactory: App\Application\PresenterFactory
harmim
Člen | 26
+
0
-

Nefunguje, stejný výsledek jako tohle

services:
    nette.presenterFactory:
        class: App\Application\PresenterFactory

Do konstruktoru pořád chodí NULL

Václav Pávek
Backer | 97
+
0
-

taky by mě to zajímalo

harmim napsal(a):

Ahoj,

mám napsanou vlastní PresenterFactory, která dědí od Nette\Application\PresenterFactory. Problém je v tom, že nevím jak ji mám zaregistrovat v Neonu.

Když to napíšu takhle, tak se nepředají argumenty do konstrukotru.

services:
	nette.presenterFactory:
		class: App\Application\PresenterFactory

Musím to dělat takhle

services:
	nette.presenterFactory:
		class: App\Application\PresenterFactory
		arguments:
			- Nette\Bridges\ApplicationDI\PresenterFactoryCallback(..., 0, NULL)

Neví někdo jak to napsat, abych tam nemusel takhle předávat ten PresenterFactoryCallback ?

Martk
Člen | 656
+
+1
-

Střílím totálně od boku, ale nešlo by udělat něco takového?

class Extension extends CompilerExtension {

	public function beforeCompile() {
		$definition = $this->getContainerBuilder()->getDefinition('application.presenterFactory');
		$factory = $definition->getFactory();
		$factory->setEntity('MyClass');
		$definition->setFactory($factory);
	}
}

EDIT:
Odzkoušeno a nakonec funguje tenhle kód (přepsání PresenterFactoryCallback):

public function beforeCompile() {
		$builder = $this->getContainerBuilder();
		$def = $builder->getDefinition('application.presenterFactory');
		/** @var Nette\DI\Statement $factory */
		$factory = $def->getFactory()->arguments[0];
		$factory->setEntity('PresenterFactory');
}

Editoval Antik (23. 2. 2016 22:03)

harmim
Člen | 26
+
0
-

@Antik To mi nefunguje, každopádně funguje tohle

public function beforeCompile()
{
	$builder = $this->getContainerBuilder();
	$presenterFactory = $builder->getDefinition('application.presenterFactory')->getFactory();
	$presenterFactory->setEntity(\App\Application\PresenterFactory::class);
}

takže díky, zatím to nechám takhle.

Pořád to není ale není hezký, nejde to udělat nějak jednodušeji, jenom v neonu?

Editoval harmim (23. 2. 2016 16:38)

Martk
Člen | 656
+
+1
-

@harmim Trošku jsem se v tom zamotal a přepsal jsem PresenterFactoryCallback místo PresenterFactory :). Přes config nelze