SabelAspect機能を使うと、簡単にAOPが可能になる。

PHPAOPだと、http://www.phpaspect.org/とかもあるが、この方式は少々大袈裟なかんじがする。
SabelAspectは完全にProxy方式。

AOPAlliance に準準拠している。

<?php
// コンテナ設定
class Config extends Sabel_Container_Injection
{
  public function configure()
  {
    $this->aspect("Target")->advice("Advice");
  }
}

// target
class Target
{
  public function getState()
  {
     return "state";
  }
}

// Advice
class Advice
{
  /**
   * @before get.+
   */
  public function beforeGet($method, $arguments, $target)
  {
    // メソッドが実行される直前に、このメソッドが実行される。
  }
  
  /**
   * @after get.+
   */
  public function afterGet($method, $arguments, $target, $result)
  {
    // メソッドが実行された後に、このメソッドが実行される。
  }
  
  /**
   * @around get.+
   */
  public function aroundGet($invocation)
  {
    // メソッドが実行される前に、このメソッドが実行される。
    
    // $invocationのproceed()メソッドを実行しなければ、ターゲットの対象メソッドが実行されることは無い
    $result = $invocation->proceed();
    
    return $result;
  }
  
  /**
   * @throws get.+
   */
  public function throwsGet($method, $arguments, $target, $result, Exception $exception)
  {
    // メソッドが実行され、例外が発生したらこのメソッドが実行される。
  }
}

// main
load("Target", new Config());

この機能はSabel 1.1からだが、1.1は7月リリース予定。