Muze tovarna na komponentu (interface) prebirat parametry z config.neon?
- chaky
- Člen | 22
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
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
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
@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%
?
- Polki
- Člen | 553
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.