Použitelná proměnná v třídě pro všechny funkce
- Danny
- Člen | 146
Dobrý den,
narazil jsem na problém kde v různých metodách v jedné třídě se musím
neustále dotazovat modelu na nějakou hodnotu(tu samou kterou potřebuji
v těch metodách). Chtěl bych to vyřešit nějakým hezkým způsobem abych
se v třídě dotázal pouze jednou a uložil si to do nějaké proměnné,
která by mohla použit jakákoliv metoda v rámci třídy.
Dospěl jsem k tomuto:
public function actionDefault($username = null)
{
$this->globalni = $this->userModel->getUser($username);
}
Je to nejlepší řešení? Popřípadě kdybych měl pak i jiné rendery než default a také bych potřeboval
$this->globalni hodnotu
jak bych to vyřešil? Musel bych použít startup?
Děkuji :)
- Danny
- Člen | 146
Díky :)
Myslíš že by si mi mohl hodit nějaký příklad jak by vypadal startup
v BasePresenteru které vyžadují příhlášené uživatele?
Asi to bude navazovat na problém který budu řešit později, abych nemusel všude zapisovat
if($user->isLoggedIn())
Nejsem si jistý jestli jsem to pochopil správně :)
- ODIS
- Člen | 33
Třeba takto:
use \Nette\Application\UI\Presenter;
abstract class BasePresenter extends Presenter
{
public function startup()
{
parent::startup();
if ($this->getName() != 'Login' && !$this->user->isLoggedIn())
{
$this->redirect('Login:default');
}
}
}
Editoval ODIS (28. 8. 2016 16:31)
- Šaman
- Člen | 2666
<?php
abstract class SecuredPresenter extends BasePresenter
{
/** @var UserRepository @inject */
public $userRepository;
/** @var Model\User */
protected $userEntity;
public function checkRequirements($element)
{
parent::checkRequirements($element);
if (!$this->user->isLoggedIn()) {
$this->flashMessage('Nejprve se přihlašte.', 'danger');
$this->redirect('App:login');
}
}
public function startup()
{
$this->userEntity = $this->userRepository->get($this->user->id);
}
?>
Třeba takhle. Ke kontrole oprávnění slouží ta checkRequirements
Ve startupu si ale donačtu vlastní plnohodnotnou entitu User
z modelu, protože v defaultní proměnné $presenter->user
je
jen jeho identity. A ta je v session, takže je problém, když si třeba
uživatel změní jméno a to se vypisuje někde v horní liště, tak
v identitě je až do příštího přihlášení starý údaj. V ORM entitě
mám vždy aktuální informace.
Pokud bys tyhle metody upravoval pak i v potomcích, tak nezapomeň zavolat
i parent::xxx()
metody z předka, pracuje se s tím zkrátka
podobně jako s konstruktorem.