Více tříd se společným předkem
- Marek Bartoš
- Nette Blogger | 1259
Zdravím, dokázal by mi někdo poradit, jak dostat do DI containeru dvě služby, které mají společného předka? Předek je abstraktní a vždy získávám konkrétní implementaci, tak jsem doufal, že bude ok, ale hlásí mi toto:
Service ‚application.1‘: Multiple services of type Modex\Extension\Module found: baseComponentsModule.module, errorModule.module
Přičemž třídu přidávám přes extension a vždy jde o konkrétní třídu
Editoval Mabar (11. 3. 2017 15:26)
- Šaman
- Člen | 2658
Je více možností. Buď používej jejich název a nikoliv název
předka.
Nebo tam měj samozřejmě jen jednu.
Anebo jedné, kterou nepouživáš běžně, vypni v configu autowired, viz dokumentace
services:
- Modex\Extension\FooModule
barModule:
class: Modex\Extension\BarModule
autowired: no
Pak se ti při použití anotace, nebo konstruktoru vždycky doplní jen
FooModule (když vyžádáš Modex\Extension\Module
). Tu druhou
máš pojmenovanou a v configu ji můžeš do nějaké služby dosadit
explicitně
services:
- MyService(@barModule)
- Marek Bartoš
- Nette Blogger | 1259
Vypnutí autowired je pro mě asi nejhorší možné řešení, tuhle třídu má každý modul a předává se do všech presenterů a většiny komponent, takže by jsem se upsal.
A název předka se používá jen v konstruktorech abstraktních tříd, které přepisuje potomek, takže nevím, kde může být problém.
$builder->addDefinition($this->prefix('module'))
->setClass($class, [$theme]);
Do $class
se předává
ModexModules\BaseComponents\Module
a
ModexModules\Error\Module
a v presenterech i komponentách se
žádá též o konkrétní implementaci
abstraktního Modex\Extension\Module
Editoval Mabar (11. 3. 2017 16:11)
- Marek Bartoš
- Nette Blogger | 1259
public function __construct(\ModexModules\Error\Module $module) {
parent::__construct($module);
}
Abstraktní parent presenter pak vyžaduje abstrakní
classu Modex\Extension\Module
Momentálně to testuju na jednom presenteru v modulu Error a jedné komponentě v BaseComponents a pro jistotu píšu i celý namespace, takže jediné, co mě napadá je, že builder si zjištuje i celý strom předků, ale v tom případě zase nedává smysl, proč tuhle chybu nevyhazuje Nette\SmartObject
- Marek Bartoš
- Nette Blogger | 1259
…mám to. Díky za rady, způsobila to má vlastní blbost. Zapomněl jsem, že presentery se do containeru přidávají automaticky a jeden BasePresenter nebyl abstraktní.
- Šaman
- Člen | 2658
Aha, tak to je poprvé, co vidím v praxi důležitost abstract
a final
. Já si je udržuji vždy takto popsané, ale myslel jsem,
že je to jen pro akademickou čistotu a případně proto, aby mi někdo
nepoužíval presentery jinak, než bylo zamýšleno (dědit z final třeba).
A ono to má občas i praktický dopad :)
- Marek Bartoš
- Nette Blogger | 1259
Já teď dělám vrstvu modularity nad nette, která by v budoucnu měla fungovat podobně pohodlně jako wordpress, ale ne tak prasácky a s mnohem většími možnostmi. Dá se v tom hodně využít dědičnosti, takže není den, kdy bych se abstract a final nevyhnul.