A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

4.11. Plugins de Controleur

Un plugin de contrôleur est une classe qui étend les fonctionnalités de tous les contrôleurs .

Sans plugins, pour étendre la fonctionnalité de tous les contrôleurs, vous devez créer une classe de base personnalisée, par exemple BaseController, et dériver d'autres contrôleurs de cette classe de base. Cette façon de faire peut également être utilisée, mais du point de vue des créateurs de ZF3, les plugins sont une meilleure solution, car ils utilisent la composition des classes 2, ce qui offre une meilleure flexibilité par rapport à l'héritage de classe. Vous déclarez votre contrôleur de plugin et il devient automatiquement accessible depuis tous les contrôleurs de votre application (la classe de base AbstractActionController utilise la méthode magique __call() de PHP pour les faire appel aux plugins de contrôleurs déclarés).

2) La composition des classes est une relation entre deux classes qui est mieux décrite comme un "has-a" et une relation "whole/part". La classe propriétaire contient une référence à une autre classe (le plugin). Le propriétaire est responsable de la durée de vie de l'objet qu'il détient.

Il y a plusieurs plugins de contrôleur standard disponibles (tableau 4.6). Nous en avons déjà utilisé un (le plugin Params) dans l'un de nos exemples précédents.

Table 4.6. Plugins de contrôleur standard
Classe de plugin standard Description
Params Permet de récupérer des variables de la requête HTTP, y compris les variables GET et POST.
Url Permet de générer des URL absolues ou relatives depuis un contrôleur.
Layout Donne accès au modèle de vue layout pour transmettre des données template du layout.
Identity Renvoie l'identité de l'utilisateur qui s'est connecté.
FlashMessenger Permet de définir des messages "flash" qui sont stockés en session et peuvent être affichés sur une autre page.
Redirect Permet de rediriger la requête vers la méthode d'action d'un autre contrôleur.
PostRedirectGet Redirige la requête POST en convertissant toutes les variables POST en GET.
FilePostRedirectGet Redirige la requête POST, en préservant les fichiers téléchargés.

À l'intérieur de la méthode d'action du contrôleur, vous accédez à un plugin de la façon suivante :

// Accès au plugin Url
$urlPlugin = $this->url();

// Accès au plugin Layout
$layoutPlugin = $this->layout();

// Accès au plugin de redirection
$redirectPlugin = $this->redirect();

Comme alternative, vous pouvez appeler un plugin par son nom complet avec la méthode plugin() fournie par le contrôleur de base, comme ceci :

use Zend\Mvc\Controller\Plugin\Url; 
 
// Dans l'action de votre contrôleur, utilisez la méthode plugin().
$urlPlugin = $this->plugin(Url::class);

4.11.1. Écrire son propre plugin de contrôleur

Dans vos sites, vous devrez probablement créer vos propres plugins de contrôleurs. Par exemple, supposons que vous ayez besoin que tous les contrôleurs soient capables de vérifier si un utilisateur du site est autorisé à accéder à certaines actions. Cela peut être implémenté avec la classe AccessPlugin.

Le plugin de contrôleur doit alors être dérivé de la classe AbstractPlugin. Les plugins sont généralement situé dans leur propre namespace Plugin, qui est imbriqué dans le namespace du Controller :

<?php
namespace Application\Controller\Plugin; 

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

// Classe Plugin
class AccessPlugin extends AbstractPlugin 
{
    // Cette méthode vérifie si l'utilisateur est 
    //autorisé à accéder à l'action
    public function checkAccess($actionName)
    {
        // ...
    }
}

Pour que Zend Framework 3 ai connaissance de votre plugin, vous devez le déclarer dans votre fichier module.config.php sous la clé controller_plugins. Voir ci-dessous pour l'exemple:

<?php
return [
    // ... 
 
    'controller_plugins' => [
        'factories' => [
            Controller\Plugin\AccessPlugin::class => InvokableFactory::class,
        ],
        'aliases' => [
            'access' => Controller\Plugin\AccessPlugin::class,
        ]
    ],
 
    // ...
];

Veuillez noter que nous déclarons également un alias pour le plugin pour pouvoir obtenir le plugin plus simplement, par son nom abrégé.

Après cela, vous serez en mesure d'accéder à votre plugin personnalisé depuis toutes les actions de votre contrôleur, comme ceci :

// Vérifiez si l'utilisateur du site est autorisé à accédeder à la page "index"
$isAllowed = $this->access()->checkAccess('index');

Top