Předání názvu modulu do modelu
- R@da
- Člen | 28
Ahoj,
mám dva moduly Pobocka1Module a Pobocka2Module. Zároveň mám společný
model, pro oba moduly.
Chtěl bych na základě toho, v jakém modulu zrovna jsem tahat z modelu
data.
Problém je v tom, že nevím jak do modelu dostat v jakém modulu se
nacházím.
Mám to momentálně takto:
Pobocka1 – HomepagePresenter
/** @var Customer */
private $customer;
public function __construct(Customer $customer)
{
$this->customer = $customer;
$this->customer->moduleName = $this->getName(); //vrací mi to null :(
}
public function renderDefault(){
...
}
Šlo by to napsat do renderDefault, ale chci to mít v konstuktoru, abych to
při každé render, action, apod. nemusel definovat znovu. A zároveň to měl
v modelu nadefinované pro všechny metody.
Můžete mi prosím poradit jak dostat modul do modelu?
Předem děkuji.
- vojtamares
- Člen | 26
Ahoj
trochu mi to přijde jako blackbox, spíš bych si dal do modelu nějaký filtr, kterým bych řekl modelu kde jsem a jaká data chci. Přijde mi to lepší než public property.
Něco jako
$this->customer->setModul(Customer::POBOCKA1_MODEL)
Uděláš v budoucnu refactoring a změní se ti name a bug je na světě, takhle je to ok.
A to jde dělat v konstruktoru.
Editoval vojtamares (26. 6. 2019 17:43)
- filsedla
- Člen | 101
Ahoj,
název modulu/presenteru/akce a.j. není v konstruktoru presenteru
k dispozici, takže tam se ti ho do modelu předat nepodaří.
Můžeš ale zařídit, aby si model získal název modulu sám, na pozadí. Je k tomu potřeba následující kód:
use Nette\Application\Application;
use Nette\Application\UI\Presenter;
class BaseModel
{
use \Nette\SmartObject;
/** @var Application */
protected $application;
public function __construct(Application $application)
{
$this->application = $application;
}
/**
* @return Presenter|null
*/
public function getPresenter()
{
return $this->application->getPresenter();
}
/**
* @return string|null
*/
public function getAction()
{
return $this->getPresenter() ? $this->getPresenter()->getAction(true) : null;
}
/**
* @return string|null
*/
public function getModule()
{
return $this->getAction() ? implode(':', explode(':', $this->getAction(), -2)) : NULL;
}
}
PS: Založit návrh modelu na tomto principu bude asi považováno za model „naruby“, takže … používej moudře.
Editoval filsedla (26. 6. 2019 17:59)
- duke
- Člen | 650
Zodpovědností modelu není řešit, z jakého presenteru (modulu) je používán, ale poskytovat služby, které jsou po něm z daného presenteru vyžadovány.
Napůl souhlasím s @vojtamares, konkrétně v tom říct si modelu o to, jaká data chci. Ne už v tom, říkat modelu, kde jsem, neboť to není jeho starost.