Composer des présentateurs à partir de traits

Si nous devons mettre en œuvre le même code dans plusieurs présentateurs (par exemple, vérifier que l'utilisateur est connecté), il est tentant de placer le code dans un ancêtre commun. La deuxième option consiste à créer des traits à usage unique.

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

Ces traits peuvent tirer parti du fait que toutes les méthodes d'injection sont appelées séquentiellement lors de la création du présentateur. Il suffit de s'assurer que le nom de chaque méthode d'injection est unique.

Les traits peuvent accrocher le code d'initialisation dans les é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 présentateur utilise alors simplement ces traits :

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