DI jak predat parametr do modelu komponenty
- saimons
- Člen | 293
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
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.