Складання презентерів з ознак
Якщо нам потрібно реалізувати один і той самий код у кількох презентерах (наприклад, перевірка того, що користувач увійшов у систему), заманливо помістити цей код у спільного предка. Другий варіант – створити одноцільові трейти.
Перевага цього рішення полягає в тому, що кожен ведучий може використовувати тільки ті ознаки, які йому справді потрібні, тоді як множинне успадкування в 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;
}