Chyba, kterou ani neumím pojmenovat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kejlicz
Člen | 201
+
0
-

Ahoj všichni.

Narazil jsem na chybu u které vůbec nechápu, co ji může způsobil. Používám Nette 2.1.1. Popíšu.

Mám normálně funkční základ aplikace, kde jsou

  • 3 presentery
  • 3 modely

a komponenta s názvem Category, používá CategoryModel, který dostává přes construktor při vytváření komponenty v BasePresenteru.
Modely mám v configu registrované jako službu a předávám je do presenterů v construktoru.

Vše tedy funguje jak má.

Mezi presentery je i RegistrationPresenter, který zatím není hotový a obsahuje zatím jen továrničku na komponentu createComponentRegistrationForm, který se po normálně zobrazí a po udeslání ho jen dumpnu.

A teď ona záhada. Když do RegistrationPresenter chci přidat constructor, zatím jen prázdný

public function __construct()
{

}

tak mi to začně házet tuhle chybu
Argument 1 passed to Category::__construct() must be an instance of Model\CategoryModel, null given, called in XXXXXXXX/app/presenters/BasePresenter.php on line 35 and defined

Na onom řádku 35 se vytváří komponeta Category

function createComponentCategory()
{
    $control = new \Category($this->categoryModel);
    return $control;
}

a ta nedostane CategoryModel. Jako by nějak přestalo fungovat DI.

Po odstranění toho prázdného constructoru to zase funguje. Vůbec nechápu souvislosti, čím by to mohlo být.

Díky za případnou pomoc.

Martin Kejzlar

Jan Tvrdík
Nette guru | 2595
+
0
-

Pokud jsem to dobře pochopil, tak ti unikají základy PHP, konkrétně to, že uvnitř toho nového konstruktoru musíš zavolat parent::__construct(...).

kejlicz
Člen | 201
+
0
-

To jsem tam dřív měl, jen jsem to pak smazal, když jsem zkoušel nějak to rozchodit. Když v onom konstruktoru volám construktor předka, takto hodí v základu stejnou chybu, ale o úroveň výš. Model nedostane konstruktor BasePresenteru.

Argument 1 passed to App\Presenters\BasePresenter::__construct() must be an instance of Model\ItemModel, none given, called in XXXXXXXXXX/app/presenters/RegistrationPresenter.php on line 12 and defined

Ale klidně je možný, že mi uniká nějaká blbost, ale zatím to fakt nechápu.

Etch
Člen | 403
+
0
-

Ano uniká.

Musíš ten konstruktor předka zavolat správně!! Nemůžeš napsat pouhé

public function __construct(){
	parent::__construct();
}

pokud má ten konstruktor předka nějaké argumenty! Musíš volat například

public function __construct(){
	parent::__construct($this->itemModel, ...);
}

Musíš prostě volat konstruktor předka včetně argumentů.

EDIT: Navíc zrovna u presenterů používat constructor injection mi přijde jako sebemrskačství.

Editoval Etch (26. 2. 2014 14:11)