Composición de presentadores a partir de rasgos

Si necesitamos implementar el mismo código en varios presentadores (por ejemplo, la verificación de que el usuario ha iniciado sesión), resulta tentador colocar el código en un ancestro común. La segunda opción es crear rasgos de propósito único.

La ventaja de esta solución es que cada presentador puede utilizar sólo los rasgos que realmente necesita, mientras que la herencia múltiple no es posible en PHP.

Estos traits pueden aprovechar el hecho de que todos los métodos de inyección son llamados secuencialmente cuando se crea el presentador. Sólo tiene que asegurarse de que el nombre de cada método de inyección es único.

Los traits pueden colgar el código de inicialización en los eventos onStartup o 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 presentador se limita a utilizar estos rasgos:

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