Aop::AddBefore()

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 :

Aop::addAround()

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 :)

Aop::addAfterReturn()

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 :

Aop::addAfterThrow()

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 :

Aop::addAfter()

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 :

  • nous mettons à jour la liste des connectés
  • puis nous envoyons un message à tous les connectés pour signaler que l'utilisateur rentre ou quitte le salon de discussion

Dans ce contexte :