Componer presenters a partir de traits

Si necesita implementar la misma funcionalidad en varios presenters (p. ej. comprobar que el usuario ha iniciado sesión), colocar el código en un antecesor común es un enfoque habitual. Otra opción es crear traits de un solo propósito.

La ventaja de usar traits es que cada presenter puede incorporar solo los traits que realmente necesita, sobre todo teniendo en cuenta que PHP no admite la herencia múltiple.

Estos traits pueden aprovechar que todos los métodos inject se llaman uno tras otro al crear la instancia del presenter. Solo hay que asegurarse de que el nombre de cada método inject sea único en todos los traits usados y en el propio presenter.

Los traits pueden enganchar 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 después simplemente usa estos traits:

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