Presenter'ları trait'lerden oluşturma

Birden fazla presenter'da aynı kodu uygulamamız gerekiyorsa (örneğin, kullanıcının oturum açıp açmadığını doğrulamak), kodu ortak bir ataya yerleştirmek bir seçenektir. İkinci seçenek, tek amaçlı trait'ler oluşturmaktır.

Bu çözümün avantajı, her presenter'ın yalnızca gerçekten ihtiyaç duyduğu trait'leri kullanabilmesidir, oysa PHP'de çoklu kalıtım mümkün değildir.

Bu trait'ler, presenter oluşturulduğunda tüm inject metotlarının sırayla çağrılması gerçeğinden yararlanabilir. Yalnızca her inject metodunun adının benzersiz olduğundan emin olmak gerekir.

Trait'ler, başlatma kodunu onStartup veya onRender olaylarına bağlayabilir.

Örnekler:

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);
		};
	}
}

Presenter daha sonra bu trait'leri basitçe kullanır:

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