Nette Documentation Preview

syntax
Sestavljanje predavateljev iz lastnosti
***************************************

.[perex]
Če moramo isto kodo implementirati v več prikazovalnikih (npr. preverjanje, ali je uporabnik prijavljen), je skušnjava, da bi kodo prenesli v skupnega prednika. Druga možnost je, da ustvarimo enonamenske [lastnosti |nette:introduction-to-object-oriented-programming#traits].

Prednost te rešitve je, da lahko vsak predstavnik uporablja samo lastnosti, ki jih dejansko potrebuje, medtem ko večkratno dedovanje v PHP ni mogoče.

Te lastnosti lahko izkoristijo dejstvo, da se ob ustvarjanju predstavnika zaporedno kličejo vse [metode inject |inject-method-attribute#inject methods]. Poskrbeti morate le, da je ime vsake metode inject edinstveno.

Značilnosti lahko inicializacijsko kodo obesijo v dogodka [onStartup ali onRender |application:presenters#Events].

Primeri:

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

Voditelj nato preprosto uporabi te lastnosti:

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


{{sitename: Best Practices}}

Sestavljanje predavateljev iz lastnosti

Če moramo isto kodo implementirati v več prikazovalnikih (npr. preverjanje, ali je uporabnik prijavljen), je skušnjava, da bi kodo prenesli v skupnega prednika. Druga možnost je, da ustvarimo enonamenske lastnosti.

Prednost te rešitve je, da lahko vsak predstavnik uporablja samo lastnosti, ki jih dejansko potrebuje, medtem ko večkratno dedovanje v PHP ni mogoče.

Te lastnosti lahko izkoristijo dejstvo, da se ob ustvarjanju predstavnika zaporedno kličejo vse metode inject. Poskrbeti morate le, da je ime vsake metode inject edinstveno.

Značilnosti lahko inicializacijsko kodo obesijo v dogodka onStartup ali onRender.

Primeri:

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

Voditelj nato preprosto uporabi te lastnosti:

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