Model v komponente a anotace @inject

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

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 ?

CZechBoY
Člen | 3608
+
+2
-

Použij konstruktor.
http://nette.matej21.cz/cs/di

jbezdicek
Člen | 13
+
0
-

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

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)

CZechBoY
Člen | 3608
+
+1
-

@jbezdicek Tak jestli ty věci spolu souvisí tak si udělej fasádu, která to za tebe všechno vyřeší.

Oli
Člen | 1215
+
+3
-

jbezdicek napsal(a):

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

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/ :)

bagr_001
Člen | 3
+
0
-

Pokud chceš injectovat do komponenty, musí být v DI configu nastavena direktiva inject: true

-
	class: App\FrontModule\MenuControl
	inject: true
Jecma
Člen | 9
+
0
-

Fasáda +1. Popř. špatný návrh komponenty, nebo modelové vrstvy. Zrovna menu asi nebude potřebovat desítky modelů a těch pár se do konstruktoru vleze.