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