Составление презентеров из признаков
Если нам необходимо реализовать один и тот же код в нескольких презентаторах (например, проверку того, что пользователь вошел в систему), то заманчиво поместить этот код в общего предка. Второй вариант – создание одноцелевых трейтов.
Преимущество этого решения заключается в том, что каждый ведущий может использовать только те признаки, которые ему действительно нужны, в то время как множественное наследование в PHP невозможно.
Эти черты могут использовать тот факт, что все методы inject вызываются последовательно при создании ведущего. Вам просто нужно убедиться, что имя каждого метода inject уникально.
Трейты могут повесить код инициализации в события onStartup или onRender.
Примеры:
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);
};
}
}
Затем ведущий просто использует эти черты:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}