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: Best Practices}}

Σύνθεση παρουσιαστών από γνωρίσματα

Εάν πρέπει να υλοποιήσουμε τον ίδιο κώδικα σε πολλούς παρουσιαστές (π.χ. επαλήθευση ότι ο χρήστης είναι συνδεδεμένος), είναι δελεαστικό να τοποθετήσουμε τον κώδικα σε έναν κοινό πρόγονο. Η δεύτερη επιλογή είναι η δημιουργία χαρακτηριστικών ενός μόνο σκοπού.

Το πλεονέκτημα αυτής της λύσης είναι ότι κάθε παρουσιαστής μπορεί να χρησιμοποιήσει μόνο τα γνωρίσματα που πραγματικά χρειάζεται, ενώ η πολλαπλή κληρονομικότητα δεν είναι δυνατή στην 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;
}