Neon factories v nette 2.1
- Jack06
- Člen | 168
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
- Jack06
- Člen | 168
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.
- David Matějka
- Moderator | 6445
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
- David Matějka
- Moderator | 6445
@Šaman: bylo to slouceno, generovane tovarnicky pis normalne pod sekci services
- Jiří Nápravník
- Člen | 710
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
@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
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
services:
-
implement: VotingModule\Component\IRatingFactory
class: VotingModule\Component\Rating
parameters: [ratedEntity]
setup:
- setRatedEntity(%ratedEntity%)