Muze tovarna na komponentu (interface) prebirat parametry z config.neon?

chaky
Člen | 22
+
0
-

Vytvoril jsem si komponentu a k ni jsem si zaroven stvoril tovarnu, ktera je napsana jako jednoduchy interface a zaregistrovana jako sluzba v config.neon

interface ISidebarControlFactory {

    /** @return SidebarControl */
    function create();
}

Nyni bych potreboval do vyrabene komponenty predat i nejaky parametr z config.neon …
Je tohle jeste mozne realizovat pres interface, nebo je v takovem pripade nutne napsat plnohodnotnou tridu SidebarControlFactory?

Pavel Kravčík
Člen | 1196
+
+2
-

Z hlavy myslím:

-
	implement: ISidebarControlFactory
	arguments: [%paramName%]

V konstruktoru třídy pak na začátek:

pf __con($paramName, ...)
{}

Editoval Pavel Kravčík (5. 4. 2018 10:35)

Felix
Nette Core | 1247
+
+5
-

Pavel Kravčík napsal(a):

Je to presne jak pises. Dodam komplet ukazku.

final class Foo extends Control
{

	public function __construct(string $bar)
	{
		$this->bar = $bar;
	}

}
interface IFooFactory
{

	public function create(): Foo;

}
services:
	-
		implement: IFooFactory
		arguments: [baz]

    # nebo

	fooFactory:
		implement: IFooFactory
		arguments: [baz]

    # nebo

	- {implement: IFooFactory, arguments: [baz]}

Editoval Felix (5. 4. 2018 14:01)

Pavel Kravčík
Člen | 1196
+
+1
-

@Felix: Ten poslední zápis je skvělej! Díky, to jsem neznal.

Ještě dotaz. Je rozdíl mezi zápisem baz či %baz%?

Felix
Nette Core | 1247
+
+1
-

Pavel Kravčík napsal(a):

Urcite je, jedno je string a druhy placeholder pro parametr. Nejak me to nedoslo a hodil jsem tam naprimo string. ;-)

Polki
Člen | 553
+
0
-

Mě to teda funguje takto:

SidebarControl.php:

final class SidebarControl extends Control
{
    public function __construct(jakekoli parametry z configu včetně služeb)
    {
		parent::__construct();
		...
    }
}

Interface:

interface ISidebarControlFactory {

    /** @return SidebarControl */
    function create();
}

A není třeba nastavovat cokoli dalšího v configu. Tak nevím, asi si to dělá jak chce co chce.

duke
Člen | 650
+
0
-

@Polki Objekty (služby) ti to doplní pomocí autowiringu (podle typu objektu), ale jiné parametry (konstanty jako např. cestu k temp adresáři) nikoli, protože Nette těžko může uhodnout jen z názvu parametru, jakou konkrétní hodnotu si tam chceš zrovna předat.