Nette Documentation Preview

syntax
Komponowanie prezenterów z cech
*******************************

.[perex]
Jeśli musimy zaimplementować ten sam kod w wielu prezenterach (np. weryfikacja, czy użytkownik jest zalogowany), kuszące jest umieszczenie kodu we wspólnym przodku. Drugą opcją jest stworzenie [cech |nette:introduction-to-object-oriented-programming#traits] jednego przeznaczenia.

Zaletą tego rozwiązania jest to, że każdy prezenter może używać tylko cech, których faktycznie potrzebuje, podczas gdy wielokrotne dziedziczenie nie jest możliwe w PHP.

Te cechy mogą wykorzystać fakt, że wszystkie [metody inject |inject-method-attribute#inject-Methods] są wywoływane sekwencyjnie, gdy prezenter jest tworzony. Musisz tylko upewnić się, że nazwa każdej metody wtrysku jest unikalna.

Traits mogą powiązać kod inicjalizacyjny ze zdarzeniami [onStartup lub onRender |application:presenters#Events].

Przykłady:

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

Prezenter wtedy po prostu wykorzystuje te cechy:

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


{{sitename: Najlepsze praktyki}}

Komponowanie prezenterów z cech

Jeśli musimy zaimplementować ten sam kod w wielu prezenterach (np. weryfikacja, czy użytkownik jest zalogowany), kuszące jest umieszczenie kodu we wspólnym przodku. Drugą opcją jest stworzenie cech jednego przeznaczenia.

Zaletą tego rozwiązania jest to, że każdy prezenter może używać tylko cech, których faktycznie potrzebuje, podczas gdy wielokrotne dziedziczenie nie jest możliwe w PHP.

Te cechy mogą wykorzystać fakt, że wszystkie metody inject są wywoływane sekwencyjnie, gdy prezenter jest tworzony. Musisz tylko upewnić się, że nazwa każdej metody wtrysku jest unikalna.

Traits mogą powiązać kod inicjalizacyjny ze zdarzeniami onStartup lub onRender.

Przykłady:

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

Prezenter wtedy po prostu wykorzystuje te cechy:

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