Composition des presenters à partir de traits

Si nous avons besoin d'implémenter le même code dans plusieurs presenters (par exemple, vérifier si l'utilisateur est connecté), il est possible de placer le code dans un ancêtre commun. La deuxième option est de créer des traits à usage unique.

L'avantage de cette solution est que chaque presenter peut utiliser exactement les traits dont il a réellement besoin, tandis que l'héritage multiple n'est pas possible en PHP.

Ces traits peuvent tirer parti du fait que lors de la création du presenter, toutes les méthodes inject sont appelées successivement. Il faut juste s'assurer que le nom de chaque méthode inject est unique.

Les traits peuvent accrocher du code d'initialisation aux événements onStartup ou onRender.

Exemples :

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);
		};
	}
}

Le presenter utilise ensuite simplement ces traits :

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