Chyba, kterou ani neumím pojmenovat
- kejlicz
- Člen | 201
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
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
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
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)