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 baseAbstractActionController
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.
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);
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');