Ajoute l'advice avant l'exécution d'une action.
Signature de la méthode Aop::addBefore() :
Aop::AddBefore(
string $selector,
callable $callback,
// Arguments facultatifs
array $options = [],
int $kind = null,
string $name = null
);
Exemple, ajouter l'advice avant l'exécution d'une méthode :
Aop::addBefore('Article::add()', function($jp) {
$args = $jp->getArgs();
$jp->setArgs( SomeValidator::validateArticle($args) );
});
Dans cet exemple, considérons que nous avons un validateur SomeValidator::validateArticle()
qui vérifie que les données sont valides et qui fait quelques pré-traitement, par exemple le validateur crée l'URL de l'article à partir du titre pour avoir une belle URL (slug).
Si la validation échoue alors une Exception
PHP est levée, la méthode $jp->setArgs()
n'est donc pas exécutée compte tenu qu'une exception PHP a interrompu l'éxecution du code.
Dans le cas où il n'y a pas d'erreur, la méthode $jp->setArgs()
change les arguments que la méthode
Article::add()
va recevoir, par ceux retournés par le validateur SomeValidator::validateArticle()
.
Dans ce contexte :
Ajoute l'advice autour de l'exécution d'une action.
Signature de la méthode Aop::addAround() :
Aop::addAround(
string $selector,
callable $callback,
// Arguments facultatifs
array $options = [],
int $kind = null,
string $name = null
);
Exemple, ajouter l'advice autour d'une méthode :
Aop::addAround('Article::get()', function($jp) {
$args = $jp->getArgs();
$id = intval($args[0]);
// si le cache existe
if(Cache::has('article-'.$id)) {
// Le cache sera retourné sans exécuter
// la méthode d'origine "Article::get()"
$jp->setReturnValue(Cache::get('article-'.$id));
}else{
// execute la méthode d'origine "Article::get()"
$jp->proceed();
// récupère la valeur de retour de "Article::get()"
$article = $jp->getReturnValue();
// ajoute la valeur de retour en cache
// au prochain appel c'est le cache qui sera retourné
Cache::add('article-'.$id, $article);
}
});
Dans cet exemple, nous avons ajouté un système de cache sans toucher à la méthode Article::get()
.
Ainsi le code métier est intact, la méthode Àrticle::get()
ne s'occuppe que de récupérer un article donné.
Dans ce contexte :
Ce qui concerne la stratégie de cache est traité hors du code métier, ce qui rend la méthode Article::get()
plus simple à maintenir et notre code est plus modulaire car nous avons séparé un aspect technique du code métier.
A partir de là, par exemple il est très simple en environnement de développement, de désactiver le cache et d'ajouter un système de debug, sans toucher au code métier :)
Ajoute l'advice après le retour d'une valeur.
Signature de la méthode Aop::addAfterReturn() :
Aop::addAfterReturn(
string $selector,
callable $callback,
// Arguments facultatifs
array $options = [],
int $kind = null,
string $name = null
);
Exemple, ajouter l'advice après le retour de la valeur d'une méthode :
Aop::addAfterReturn('Article::save()', function($jp) {
$article = $jp->getReturnValue();
// Met à jour le cache
Cache::set('article-'.$article->id, $article);
});
Dans cet exemple, nous mettons à jour le cache d'un article lorsque celui est modifié dans la base de données.
Dans ce contexte :
Ajoute l'advice après la levée d'une exception.
Signature de la méthode Aop::addAfterThrow() :
Aop::addAfterThrow(
string $selector,
callable $callback,
// Arguments facultatifs
array $options = [],
int $kind = null,
string $name = null
);
Exemple, ajouter l'advice après une erreur sur l'une des méthodes natives de l'extension PDO incluse dans PHP :
Aop::addAfterThrow('PDO::*()', function($jp) {
$log->error($jp->getException()->getMessage());
});
Dans cet exemple, nous ajoutons un log d'erreur à chaque erreur générée par les méthodes de PDO
.
Dans ce contexte :
Même chose avec les fonctions PHP natives de l'extension mysqli incluse dans PHP :
Aop::addAfterThrow('mysqli_*()', function($jp) {
$log->error($jp->getException()->getMessage());
});
Dans cet exemple, nous ajoutons un log d'erreur à chaque erreur générée par les fonctions mysqli
de PHP.
Dans ce contexte :
Ajoute l'advice après une action.
Cette méthode fournit un JoinPoint
équivalent Aop::addAfterReturn()
+ Aop::addAfterThrow()
réunies en un seul objet.
Aop::addAfter()
offre donc les mêmes possibilités que Aop::addAfterReturn()
et Aop::addAfterThrow()
.
Signature de la méthode Aop::addAfter() :
Aop::addAfter(
string $selector,
callable $callback,
// Arguments facultatifs
array $options = [],
int $kind = null,
string $name = null
);
Exemple, ajouter l'advice après la modification d'une propriété :
Aop::addAfter('User::logged', function($jp) {
$logged = $jp->getPropertyValue();
if($logged) {
$chat->list->add($user);
$chat->sendMessage($user->username.' a rejoint le salon.');
}else{
$chat->list->remove($user);
$chat->sendMessage($user->username.' a quitté le salon.');
}
});
Dans cet exemple considérons qu'il s'agisse d'un chat de discussion, lorsque la propriété User::$logged
est modifiée :
Dans ce contexte :