Composer des presenters à partir de traits

Si vous avez besoin d'implémenter la même fonctionnalité dans plusieurs presenters (par exemple vérifier que l'utilisateur est connecté), placer le code dans un ancêtre commun est une approche courante. Une autre possibilité est de créer des traits à usage unique.

L'avantage des traits est que chaque presenter peut n'incorporer que ceux dont il a réellement besoin, d'autant que l'héritage multiple n'existe pas en PHP.

Ces traits peuvent tirer parti du fait que toutes les méthodes inject sont appelées les unes après les autres lors de la création de l'instance du presenter. Il vous suffit de veiller à ce que le nom de chaque méthode inject soit unique parmi tous les traits utilisés et le presenter lui-même.

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 se contente ensuite d'utiliser ces traits :

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