Předání názvu modulu do modelu

R@da
Člen | 28
+
0
-

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

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
+
-2
-

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
+
+2
-

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.

Andy3
Člen | 15
+
0
-

Za me by ten Customer::POBOCKA1_MODEL mel byt v getteru. Neco ve stylu, dejmi uzivatele s id „x“ k pobocce „y“. Ono setovat neco do nejake sluzby a ovlinovat tak jeji chovani neni uplne best-practice.

Editoval Andy3 (29. 6. 2019 6:34)