Composizione dei presenter da trait
Se abbiamo bisogno di implementare lo stesso codice in più presenter (ad esempio, verificare che l'utente sia loggato), possiamo inserire il codice in un antenato comune. La seconda opzione è creare trait specifici per uno scopo.
Il vantaggio di questa soluzione è che ciascuno dei presenter può utilizzare esattamente i trait di cui ha effettivamente bisogno, mentre l'ereditarietà multipla non è possibile in PHP.
Questi trait possono sfruttare il fatto che, alla creazione del presenter, vengono chiamati progressivamente tutti i metodi inject. È solo necessario assicurarsi che il nome di ogni metodo inject sia unico.
I trait possono agganciare il 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 quindi utilizza semplicemente questi trait:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}