Composición de Presenters a partir de traits
Si necesitamos implementar el mismo código en varios Presenters (p. ej., verificar que el usuario haya iniciado sesión), una opción es colocar el código en un ancestro común. La segunda opción es crear traits de propósito único.
La ventaja de esta solución es que cada Presenter puede usar exactamente los traits que realmente necesita, mientras que la herencia múltiple no es posible en PHP.
Estos traits pueden aprovechar el hecho de que al crear un Presenter, todos los métodos inject se llaman secuencialmente. Solo es necesario asegurarse de que el nombre de cada método inject sea único.
Los traits pueden adjuntar código de inicialización a los eventos onStartup u onRender.
Ejemplos:
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);
};
}
}
El Presenter luego simplemente usa estos traits:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}