Nette Documentation Preview

syntax
Comporre i presenter con i trait
********************************

.[perex]
Se dovete implementare la stessa funzionalità in più presenter (per esempio la verifica del login dell'utente), un approccio comune è collocare il codice in un antenato comune. Un'altra possibilità è creare [trait |nette:introduction-to-object-oriented-programming#Trait] monouso.

Il vantaggio dei trait è che ogni presenter può incorporare solo i trait di cui ha davvero bisogno, tanto più che in PHP l'ereditarietà multipla non è supportata.

Questi trait possono sfruttare il fatto che tutti i [metodi inject |inject-method-attribute#Metodi inject*()] vengono chiamati in sequenza al momento della creazione dell'istanza del presenter. Dovete solo assicurarvi che il nome di ogni metodo inject sia univoco tra tutti i trait usati e il presenter stesso.

I trait possono agganciare del codice di inizializzazione agli eventi [onStartup o onRender |application:presenters#Eventi].

Esempi:

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

Il presenter poi si limita a usare questi trait:

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

Comporre i presenter con i trait

Se dovete implementare la stessa funzionalità in più presenter (per esempio la verifica del login dell'utente), un approccio comune è collocare il codice in un antenato comune. Un'altra possibilità è creare trait monouso.

Il vantaggio dei trait è che ogni presenter può incorporare solo i trait di cui ha davvero bisogno, tanto più che in PHP l'ereditarietà multipla non è supportata.

Questi trait possono sfruttare il fatto che tutti i metodi inject vengono chiamati in sequenza al momento della creazione dell'istanza del presenter. Dovete solo assicurarvi che il nome di ogni metodo inject sia univoco tra tutti i trait usati e il presenter stesso.

I trait possono agganciare del codice di inizializzazione agli eventi onStartup o onRender.

Esempi:

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

Il presenter poi si limita a usare questi trait:

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