Model v komponente a anotace @inject
- jbezdicek
- Člen | 13
Ahoj,
chtel jsem pouzit modelovou tridu v komponente, avsak se potykam s timto problemem:
Call to a member function getCategoriesForMenu() on null
<?php
namespace App\FrontModule;
use App\Model\Category;
use Nette\Application\UI\Control;
class MenuControl extends Control
{
/** @var Category @inject */
public $categoryModel;
public function render()
{
$template = $this->getTemplate();
$template->setFile(__DIR__ . '/default.latte');
dump($this->categoryModel->getCategoriesForMenu());
$template->render();
}
}
Modely jsou zaregistrovany v configu i se spravnym namespacem
Opravdu bych rad byl schopny pouzivat @inject v komponentach, ale nevypada to, ze by to fungovalo. Nejaky tip ?
- jbezdicek
- Člen | 13
CZechBoY napsal(a):
Použij konstruktor.
http://nette.matej21.cz/cs/di
To vim, ale radsi bych uvital pouziti @inject, protoze v extremnich pripadech, kdy tam budu mit vice modelu by ten konstruktor byl asi dosti nepekny
- Martk
- Člen | 661
Co takhle udělat něco takového, kdybys opravdu chtěl předávat hodně modelů.
interface IMenuItem {
public function getMenuItems();
}
////
class MenuItems {
/** @var IMenuItem[] */
private $items = [];
public function add(IMenuItem $item) {
$this->items[] = $item;
}
}
V configu naházíš ty modely a předáš v constructoru jen třídu MenuItems.
PS: Názvy třídy a interface bych změnil
Editoval Martk (23. 2. 2017 20:30)
- Oli
- Člen | 1215
jbezdicek napsal(a):
CZechBoY napsal(a):
Použij konstruktor.
http://nette.matej21.cz/cs/diTo vim, ale radsi bych uvital pouziti @inject, protoze v extremnich pripadech, kdy tam budu mit vice modelu by ten konstruktor byl asi dosti nepekny
Dosti nepěkný bude spíš ten návrh aplikace. Pokud má konstruktor hodně závislostí, tak ta třída nejšpíš dělá víc než jednu věc a to je špatně.
Pokud opravdu dělá jen jednu věc a má moc závislostí, tak by měli stejně být vidět v konstruktoru. A je jedno, jestli v konstruktoru tý třídy nebo v nějaký fasádě nebo něčem takovým. Ta třída na tom závisí, je blbost to nezkontrolovat při sestavení DI kontaineru.
Tady by ti to mohlo objasnit, proč je to dobrý mít v konstruktoru: https://pehapkari.cz/…y-a-v-nette/ :)