Použitelná proměnná v třídě pro všechny funkce

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

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 :)

Šaman
Člen | 2666
+
+2
-

Ano, pokud chceš naplnit property presenteru, je nejlepší použít startup. Dokonce možná i metodu startup v nějakém BasePresenteru, předkovi všech presenterů které vyžadují přihlášeného uživatele.
Všude mimo presentery by se to řešilo v konstruktoru.

Danny
Člen | 146
+
0
-

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

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)

CZechBoY
Člen | 3608
+
0
-

@ODIS isLoggedIn je metoda, takze ti tam chybi ().

ODIS
Člen | 33
+
0
-

@CZechBoY pochopitelně, díky za opravu :).

Šaman
Člen | 2666
+
+1
-
<?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.

Danny
Člen | 146
+
0
-

Super děkuju moc :)