Agir sans toucher le code métier
L'AOP permet d'ajouter une fonctionnalité dans un code métier,
sans y insérer une seule ligne de code à l'intérieur.
La portion de code est interceptée lors de son exécution (pointcut)
et vous prenez le contrôle via une fonction de rappel (advice).
Exemple d'utilisation, considérons un site ayant :
- son propre système de connexion et de session utilisateur
- et un blog propulsé par WordPress
Lorsqu'un utilisateur se connecte à son compte via votre blog Wordpress,
avec l'AOP il est simple de le connecter aux applications tierces utilisées
sur votre site en interceptant la méthode de connexion
(ici celle de WordPress pour l'exemple).
Inversement si l'utilisateur se connecte via votre site,
vous pouvez le connecter à WordPress et aux autres applications utilisées
sur votre site (exemple un forum phpBB). Idem pour la déconnection, etc
On peut intercepter le code avant (before) son exécution, après (after) et autour (around).
Dans cet exemple, nous interceptons la fonction de connexion de WordPress
wp_signon()
(
https://codex.wordpress.org/Function_Reference/wp_signon).
L'interception est de type "around" (autour) pour
avoir accès aux arguments et traiter soit même l'exécution de la fonction.
// Intercepte la fonction de connection de WordPress.
Aop::addAround('wp_signon()', function($jp) {
// tous les arguments passés à la fonction
// wp_signon() de WordPress
$args = $jp->getArgs();
// l'argument $credentials de WordPress
// voir https://codex.wordpress.org/Function_Reference/wp_signon
$credentials = $args[0];
// procèder à l'execution normale
// de "wp_signon()" (la fonction interceptée)
$jp->proceed()
// récupérer sa valeur de retour
$wpUser = $jp->getReturnValue();
// si l'utilisateur est identifié à Wordpress
if( !is_wp_error($wpUser) ) {
// connecter l'utilisateur
// à votre propre gestionnaire d'utilisateur
// exemple
$user->login(
$credentials['user_login'],
$credentials['user_password']
);
}
});