ServiceCreationException: Service Invalid type ' '

user321
Člen | 5
+
0
-

Ahoj, zkousim touto cestou najit nekoho kdo by me mohl poradit. Delam upgrade app na nette 3.0 a kdyz jsem se dostal k poslednimu neonu, kde se konfiguruje balicek puvodnich autoru, tak dostavam tuto chybu:

Nette\DI\ServiceCreationException:Service 'attachmentsDatagridFilterFormFactory'
(type of App\Components\AttachmentsDatagrid\AttachmentsFilter\AttachmentsFilterForm\IAttachmentsFilterFormFactory): Invalid type ''.

Nejak nemuzu prijit jaky je duvod (v kodu je hodne interface kde jsou typy pouze v php docu), ale u nich jsem tuto chybu nedostal. Predpokladam, ze se jedna o problem s return type, protoze kdyz jsem narazil na problem s typem parametru v create fnci, tak je u chyby uveden i nazev parametru. Zkousel jsem overit zda neni nekde preklep v namespacu, ale tam sem chybu nenasel. Zkousel jsem vlozit return type za definici parametru ...): AttachmentsFilterForm;, ale porad stejna chyba :(

Aktualni verze balicku nette/...: 3.0.* (napr application@3.0.8, di@3.0.17, etc..)

// app/Components/AttachmentsDatagrid\AttachmentsFilter\AttachmentsFilterForm\IAttachmentsFilterFormFactory.php
interface IAttachmentsFilterFormFactory
{
	/**
	 * @param IContainer $parent [OPTIONAL]
	 * @param string $name [OPTIONAL]
	 * @param array $columnsMapping [OPTIONAL]
     *
	 * @return AttachmentsFilterForm
	 */
	public function create(IContainer $parent = null, $name = null, $columnsMapping = array());
}

// app/Components/AttachmentsDatagrid\AttachmentsFilter\AttachmentsFilterForm\AttachmentsFilterForm.php
class AttachmentsFilterForm
{
    public function __construct(IContainer $parent = null, $name = null, $columnsMapping = array()) { ... }
}
attachmentsDatagridFilterFormFactory:
		implement: App\Components\AttachmentsDatagrid\AttachmentsFilter\AttachmentsFilterForm\IAttachmentsFilterFormFactory

Budu velice rad za kazdy napad ;) Uprimne se snazim vyhnout prepisovani celeho moloch balicku, ktery hazi tuto chybu.

Šaman
Člen | 2658
+
0
-

Střelba naslepo, ale trklo mě: IContainer $parent = null
Tedy že proměnná $parent není optional, vyžaduje se IContainer, neakceptuje null.
U $name to platí taky, ale tam to není přímo v kódu, jen v komentáři, takže to asi nevyhazuje chybu.

Editoval Šaman (23. 8. 15:37)

user321
Člen | 5
+
0
-

Diky za odpoved ;)) tak zatim jsem to vyresil pres upravu create fnce v interface (uplne netusim zda to je koser) i kdyz v constructoru to nebylo potreba :D

interface IAttachmentsFilterFormFactory {
  public function create(IContainer $parent = null, string $name = null, array $columnsMapping = []);
}
class AttachmentsFilterForm {
  public function __construct(IContainer $parent = null, $name = null, $columnsMapping = []) { ... }
}

trklo mě: IContainer $parent = null

JJ tento zapis je fuj a uz se tesim ze ho nikdo nebude pouzivat. V podstate je to stejne jako napsat IContainer|null $parent = null i kdyz v php8.4 uz to bude deprecated

PHP 8.4: Implicitly nullable parameter declarations deprecated

- function test(string $test = null) {}
+ function test(?string $test = null) {}