Nette Documentation Preview

syntax
Складання презентерів з ознак
*****************************

.[perex]
Якщо нам потрібно реалізувати один і той самий код у декількох презентерах (наприклад, перевірка того, що користувач увійшов до системи), виникає спокуса помістити код у спільного предка. Другий варіант - створення одноцільових [ознак |nette:introduction-to-object-oriented-programming#traits].

Перевага цього рішення полягає в тому, що кожен ведучий може використовувати тільки ті ознаки, які йому справді потрібні, тоді як множинне успадкування в PHP неможливе.

Ці риси можуть використовувати той факт, що всі [методи inject |inject-method-attribute#inject-Methods] викликаються послідовно при створенні ведучого. Вам просто потрібно переконатися, що ім'я кожного методу inject унікальне.

Трейти можуть повісити код ініціалізації в події [onStartup або onRender |application:presenters#Events].

Приклади:

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

Потім ведучий просто використовує ці риси:

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


{{sitename: Найкращі практики}}

Складання презентерів з ознак

Якщо нам потрібно реалізувати один і той самий код у декількох презентерах (наприклад, перевірка того, що користувач увійшов до системи), виникає спокуса помістити код у спільного предка. Другий варіант – створення одноцільових ознак.

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