Instancování pomocí továren v modelu
- sitnarf
- Člen | 27
Ahoj,
uniká mi asi podstatná součást DI v nette. Továrničky, které si definuji
v konfigu slouží k pohodlnějšímu instancování tříd, předávání
závislostí atd., je to tak?
Pokud mám ale např. třídu NodeCollection (instancovanou taky přes továrnu
v presenteru) a ta si vytvari instance tridy Node a v konfigu budu mit
factories:
nodeCollection:
class: NodeCollection(%rows%, @database)
parameters: [rows]
node:
class: Node(%row%, @database)
parameters: [row]
Jak instancuji Node v NodeCollection?
- mkoubik
- Člen | 728
Použij továrničky generované z interface (https://doc.nette.org/…tion/factory
na konci) a předej si ten interface do Node
třeba
konstruktorem.
- sitnarf
- Člen | 27
mkoubik napsal(a):
Použij továrničky generované z interface (https://doc.nette.org/…tion/factory na konci) a předej si ten interface do
Node
třeba konstruktorem.
Díky za odpověď. Moc tomu nechápu, takže (reaguji na článek) ten
konkretní mailingFactory
mi vygeneruje DIC sám podle interface?
A jak vybere konkrétní implementaci? Podle řádku
/* @return Nette\Mail\Message */
v definice interfacu
IMailingMessageFactory
?
Editoval sitnarf (17. 7. 2013 19:52)
- David Matějka
- Moderator | 6445
presne tak, podle anotace @return urcis tridu, kterou budes vytvaret. pripadne nemusis psat anotaci a v neonu zapsat:
factories:
fooFactory:
class: Foo
implement: FooFactory
pripadne muzes pridat setup metody, v konstruktoru vyzadat zavislosti, parametry, argumenty… nette potom samo vygeneruje tridu implementujici to rozhrani a registruje to jako sluzbu
Editoval matej21 (17. 7. 2013 21:11)
- David Matějka
- Moderator | 6445
@zimmi: bohuzel ano, ale neni problem si factory napsat rucne, je vsak problem, ze musis zavislosti spravovat na obou mistech – v samotne tride a ve factory, v DIC factories se zavislosti v factory urceji podle tridy. jak teda muze vypadat vlastni neautomaticka create:
//trida, kterou bude factory vytvaret
class Foo
{
public function __construct($parametr, Zavislost1 $zavislost1, Zavislost2 $zavislost2)
{
...
}
}
//factory
class FooFactory
{
$zavislost1;
$zavislost2;
public function __construct(Zavislost1 $zavislost1, Zavislost2 $zavislost2)
{
$this->zavislost1 = $zavislost1;
$this->zavislost2 = $zavislost2;
}
public function create($parametr)
{
return new Foo($parametr, $this->zavislost1, $this->zavislost2);
}
}
v neonu registrujes factory jako sluzbu:
services:
fooFactory: FooFactory
pro porovnani jeste napisu, jak by stacilo zapsat pri pouziti DIC factories z devu:
//tovarna
interface FooFactory
{
/**
* @return Foo
*/
public function create($parametr);
}
registrace v neonu:
factories:
fooFactory:
implements: FooFactory
class: Foo
parameters: [parametr]
arguments: [%parametr%]