Neon factories v nette 2.1

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

Zdravím, dříve fungovalo toto:

factories:
	frontForm:
		class: Nette\Application\UI\Form
		setup:
			- setTranslator(@translator)

	adminForm:
		class: Nette\Application\UI\Form

Nyní to bohužel hlásí: Multiple services of type Nette\ComponentModel\IContainer found.

Chci se zeptat, zda a jak se to dá řešit. Obecně je to problém toho když chci jinou konfiguraci frontendu a backendu. Díky

Aurielle
Člen | 1281
+
0
-

Nejspíš budeš muset přidat autowired: no a doplňovat tyto služby do všech dalších definic manuálně (protože by autowiring nepoznal, kterou z nich zrovna požaduješ). Jinou možností je podědit si Form a do definic uvést přímo poděděné třídy.

Jack06
Člen | 168
+
0
-

Okey, v tom případě, jak to funguje dál volal jsem to totiž jako callback, který nyní už také není.

class ControlFactory extends \Nette\Object
{

	/** @var Callback */
	private $factory= NULL;

	/**
	 * @param Callback|NULL $factory
	 */
	public function inject(\Nette\Utils\Callback $factory = NULL)
	{
		$this->factory= $factory;
	}
}

Kód výše fungoval před změnou, když to byla ještě factory, nní už to bohužel nefunguje. Předpokládal jsem, že to pujde jako Closure, ale do injectu nyní nejde callback, ale přímo Nette\Application\UI\Form. Na tom samozřejmě nemohu volat invoke a tedy vlastně celá pointa factory je ta tam.

MartinitCZ
Člen | 580
+
+1
-

Na 2.1 jsou factories deprecated https://github.com/…fb41417e28a5

Jack06
Člen | 168
+
0
-

To vím, hledám nějaké řešení :-)

David Matějka
Moderator | 6445
+
+1
-

udelej si z tovarnicek sluzby, to muzes bud ze si vytvoris tridu:

class FooFactory
{
	public function create()
	{
		$foo = new Foo;
		...
		return $foo;
	}
}

a tu pak registrujes jako sluzbu

services:
	- FooFactory

nebo muzes vytvorit pouze interface

interface FooFactory
{
	/**
	* @return Foo
	*/
	public function create();
}

a registruj v configu, nette se pak postara o vytvoreni tridy:

services:
	- FooFactory

v presenteru si to injectnes jako kazdou jinou zavislost

vice treba tady https://doc.nette.org/…tion/factory

Šaman
Člen | 2640
+
0
-

Omlouvám se, pokud pouštím vyplašenky zbytečně. Ale jak to, že je sekce factories deprecated? Myslel jsem, že je na generované továrničky?!? V @dev verzi mi to rozhodně funguje.

David Matějka
Moderator | 6445
+
0
-

@Šaman: bylo to slouceno, generovane tovarnicky pis normalne pod sekci services

Jiří Nápravník
Člen | 710
+
0
-

Nyní je vyhazována tato vyjímka: „Section ‚factories‘ is deprecated, move definitions to section ‚services‘ and append key 'autowired: no“

Proč je má být autowired:no ?

Druhá otázka, jde tenhle autowired (případně i jiné věci) u nepojmenovanýc services?

David Matějka
Moderator | 6445
+
0
-

@Jiří Nápravník: to autowired: no je pro ty stare tovarnicky, ktere se pouzivaly nejak $container->createSomething(), ted tam das to autowired: no a vytvoris pomoci $container->createService('something'). ale generovane tovarnicky zustavaji stejne, pouze se presouvaji pod sekci services

k druhe otazce: jj, normalne:

services:
	-
		class: Something
		autowired: no
Jiří Nápravník
Člen | 710
+
0
-

matej21: díky za upřesnění

co se týče toho druhého, tak když to udělám jako ty tak mi to píše, že mám špatné odsazení a musím být na provni s pomlčkou, tedy něco takového

services:
	- VotingModule\Component\IRatingFactory
	class: VotingModule\Component\Rating
	parameters: [ratedEntity]
	setup:
		- setRatedEntity(%ratedEntity%)

nicméně tady mi to pak píše,
Missing item ‚ratedEntity‘ …

David Matějka
Moderator | 6445
+
0
-
services:
    -
        implement: VotingModule\Component\IRatingFactory
        class: VotingModule\Component\Rating
        parameters: [ratedEntity]
        setup:
            - setRatedEntity(%ratedEntity%)
Jiří Nápravník
Člen | 710
+
0
-

jo aha, nechat pouze pomlčku samotnou. Super, díky!