Chybný konstruktor vytvářené služby v DI containeru
- teekey99
- Člen | 45
Prosím o radu s následujícím problémem.
Mám projekt, který jsem upgradoval z Nette 2.4 na 3.0. V testech máme
implementovanou třídu RequestMock
, která dědí
Nette\Http\Request
a přes kterou mockujeme v případě potřeby
některé parametry requestu (headers, files, ajax apod.). Ta je v testovacím
configu registrovaná:
services:
http.request: Flowgate\FunctionalTests\RequestMock
Doteď vše fungovalo, ale po upgradu mi padá DI container a to kvůli tomuto vygenerovanému kódu v jeho classe:
public function createServiceHttp__request(): Flowgate\FunctionalTests\RequestMock
{
return new Nette\Http\Request(new Nette\Http\UrlScript('http://localhost'));
}
Zatím si s tím nevím rady. Jak vidno, konfigurátor při generování správně použije return type, ale nevím proč, zavolá konstruktor poděděné třídy, resp. je to de facto obsah konstruktoru toho našeho mocku.
public function __construct()
{
$urlScript = new UrlScript('http://localhost');
parent::__construct($urlScript);
}
Netušíte někdo, v čem může být problém?
- teekey99
- Člen | 45
Už jsme zjistili, kde je problém. S upgradem jsme vyměnili
kdyby/console
za contributte/console
a ve chvíli kdy
je v configu nastaveno:
console:
url: http://localhost
Pak Contributte\Console\DI\ConsoleExtension#156
forcne
zaregistrování Nette\Http\Request
s parametrem z configu pod
definicí http.request
, ačkoliv DIC očekává ten náš
RequestMock
.
Řešíme, co s tím dál.
- Marek Bartoš
- Nette Blogger | 1274
Asi by bylo nejvhodnější, kdyby contributte console přetížila jen
RequestFactory, pak bude pořád možné přepsat request.
Lepší řešení asi momentálně není – v extension je třeba přepisovat
službu až v beforeCompile kvůli neznámému pořadí extensions a co je
v beforeCompile už v configu nelze přepsat