Presenter'ları Trait'lerden Kurma
Aynı işlevi birden çok presenter'da gerçekleştirmeniz gerekiyorsa (örneğin kullanıcının oturum açtığını doğrulamak), kodu ortak bir ataya koymak yaygın bir yaklaşımdır. Bir başka seçenek de tek amaçlı trait'ler oluşturmaktır.
Trait kullanmanın üstünlüğü, her presenter'ın yalnızca gerçekten ihtiyaç duyduğu trait'leri almasıdır; hele ki PHP'de çoklu kalıtım desteklenmediği düşünülürse.
Bu trait'ler, presenter örneği oluşturulurken tüm inject metotlarının sırayla çağrıldığı gerçeğinden yararlanabilir. Yalnızca her inject metodunun adının, kullanılan tüm trait'ler ve presenter'ın kendisi arasında benzersiz olmasını sağlamanız gerekir.
Trait'ler, başlatma kodunu onStartup ya da 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 ise yalnızca bu trait'leri kullanır:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}