DI jak predat parametr do modelu komponenty

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

Nevim zda vubec uvazuji spravne s DI se seznamuji tak den. Ale mam komponentu na vypis menu v BO a potrehuju do modelu od komponenty nak dostat persistentni parametr. Nak z logiky DI co jsem pochopil by se tam mel parametr predat do konstrokturu a ne k nemu pristupovat primo v komponente, ale nevim jak toho docilim.

config.neon

services:
        menuModel:
                class: AdminModule\MenuModel
                arguments: ["@database"]

AdminPresenter.php

abstract class AdminPresenter extends \BasePresenter {
    protected function createComponentMenu() {
        $menu = new MenuControl;
        $menu->setModel($this->context->menuModel);
        return $menu;
    }
}

MenuControl.php

class MenuControl extends Control {

    private $menuModel;

    public function setModel($menuModel){
        $this->menuModel = $menuModel;
    }

   public function render() {
	...
        $template->menu = $this->menuModel->getArticlesMenu();;
        $template->render();
    }

controlModel.php

class MenuModel extends Object
{

    public $database;

    public function __construct($database) {
        $this->database = $database;
    }

    public function getArticlesMenu() {
        return TRUE; //treba data z DB
    }
}

Nevim jestli tenhle postup je spravny, pripade budu vdecny za nake poznamku. Ale vubec se mi nepodarilo zprovoznit to jakym zposobem dostat do constuctoru jeste polozku persistentniho parametru. Nebo spis kam bych ten kod mel umistit a jakym zpusobem nakonfigurovat sluzbu nebo tovarnu? Premyslel jsem o tom, ze bych si vytvoril sluzbu a tam predal persistentni parametr, a ten potom v configu predal sluzbe menuModel, ale to porad budu mit predani parametru nekde v modelu jen jinde. Pravdepodobne o tom premyslim nak spatne, tak budu vdecny za nake popostrceni. Diky

EDIT: Tak jsem trochu jeste patral a uz jsem to trochu asi pochopil, ale ma finalni otazka je jak spravne pristoupit persistentnimu parmetru a zjisteni aktualniho pohledu v modelu od controleru. Je spravny postup si vytvorit sluzbu ktera bude detit Presenter tam zjistit tyhle udaje a predat je konkretnimu modelu?

services:
        presenterInfo:
                class: AdminModule\PresenterInfo

        menuModel:
                class: AdminModule\MenuModel
                arguments: ["@database", "@presenterInfo"]

Akorat teda nevim jak pak pristoupit k v PresenterInfo k getPresenter() protoze tam nic nevidim. Takze jsem asi premyslel spatne. :)

Editoval saimons (15. 12. 2011 16:09)

David Grudl
Nette Core | 8228
+
0
-

Ten kód je zcela správně. Pokud bys v MenuModel::__construct() uvedl typehint, služba @database se předá dokonce sama, bez nutnosti ji specifikovat v arguments (tzv. auto-wiring).

Perzistentní parametr, stejně jako jakýkoliv jiný parametr, modelu předá přímo presenter či komponenta.

saimons
Člen | 293
+
0
-

Ok, diky za info.