Chybný konstruktor vytvářené služby v DI containeru

teekey99
Člen | 45
+
0
-

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
+
0
-

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 | 520
+
0
-

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

teekey99
Člen | 45
+
0
-

@Mabar Jasný, díky za reakci. Řešíme to s kolegou, pokud přijdem s něčím smysluplným, pošlem do příslušného repa PR.