Előadók összeállítása tulajdonságokból

Ha ugyanazt a kódot több prezenterben kell implementálnunk (pl. annak ellenőrzése, hogy a felhasználó be van-e jelentkezve), akkor csábító, hogy a kódot egy közös ősben helyezzük el. A második lehetőség az egycélú tulajdonságok létrehozása.

Ennek a megoldásnak az az előnye, hogy minden egyes prezenter csak azokat a tulajdonságokat használhatja, amelyekre ténylegesen szüksége van, míg a többszörös öröklés nem lehetséges a PHP-ben.

Ezek a vonások kihasználhatják azt a tényt, hogy a prezenter létrehozásakor az összes injektált metódus egymás után hívódik meg. Csak arra kell ügyelni, hogy minden egyes inject metódus neve egyedi legyen.

A vonások az inicializálási kódot az onStartup vagy onRender eseményekbe akaszthatják.

Példák:

trait RequireLoggedUser
{
	public function injectRequireLoggedUser(): void
	{
		$this->onStartup[] = function () {
			if (!$this->getUser()->isLoggedIn()) {
				$this->redirect('Sign:in', $this->storeRequest());
			}
		};
	}
}

trait StandardTemplateFilters
{
	public function injectStandardTemplateFilters(TemplateBuilder $builder): void
	{
		$this->onRender[] = function () use ($builder) {
			$builder->setupTemplate($this->template);
		};
	}
}

Az előadó egyszerűen felhasználja ezeket a tulajdonságokat:

class ArticlePresenter extends Nette\Application\UI\Presenter
{
	use StandardTemplateFilters;
	use RequireLoggedUser;
}