4.3. S2AopFactoryを用いてAspectする

S2AopFactoryクラスのcreateメソッドを用いて、あるクラスの拡張クラスを生成し、アスペクトを織り込んだインスタンスを取得します。

public static function create(ReflectionClass $targetClass, array $aspects, array $args = array(), array $parameters = array()) 
  • 第1引数 : Aspect対象クラス
  • 第2引数 : 織り込むAspect
  • 第3引数 : コンストラクタ引数
  • 第4引数 : S2Aop.PHP用の拡張パラメータ

例として、次のようなサービスクラスにAspectを適用してみます。

class Service {
    public function add($a, $b) {
        return $a + $b;
    }
}

ServiceクラスのaddメソッドにTraceInterceptorをAspectします。

<?php
require_once('S2Container/S2Container.php');
seasar\util\ClassLoader::import(dirname(__FILE__) . '/classes');

$interceptor = new seasar\aop\interceptor\TraceInterceptor;
$pointcut    = new seasar\aop\Pointcut('^add$');
$aspect      = new seasar\aop\Aspect($interceptor, $pointcut);
$service     = S2AopFactory::create(new ReflectionClass('Service'), array($aspect));

print get_class($service) . PHP_EOL;
$result = $service->add(2, 3);

Interceptor. 

seasar\aop\MethodInterceptor インターフェースを実装するクラスです。S2Aopでは、次のインターセプターがバンドルされています。

  • seasar\aop\interceptor\TraceInterceptor
    トレース処理を「Crosscutting Concern」として扱うためのInterceptorです。
  • seasar\aop\interceptor\MockInterceptor
    Mockを使ったテストを簡単に行うためのInterceptorです。
  • seasar\aop\interceptor\InterceptorChain
    複数のInterceptorをグルーピング化し再利用しやすくします。

Pointcut. 

MethodInterceptorがどこに適用されるのかをあらわすクラスです。

/**
 * Pointcutを構築します。
 * @param mixed $target
 */
seasar\aop\Pointcut::__construct($target)

コンストラクタ引数の$targetには、Pointcutを指定する正規表現文字列、またはReflectionClassを渡します。 ReflectionClassの場合は、そのクラスが実装している Abstract Public メソッドがPointcutとなります。 インターフェースを実装していない場合は、クラスのすべての Public メソッドで次の条件を除くメソッドが対象になります。

  • 親クラスが実装しているメソッドは対象外となります。
  • set、get、is で名前が始まるメソッドは対象外となります。

Aspect. 

MethodInterceptor(Advice)とPointcutを関連付けるクラスです。

/**
 * Aspectを構築します。
 * @param seasar\aop\MethodInterceptor $methodInterceptor
 * @param seasar\aop\Pointcut $pointcut
 */
seasar\aop\Aspect::__construct(MethodInterceptor $methodInterceptor, Pointcut $pointcut)

コンストラクタ引数で、MethodInterceptorとPointcutを指定します。



© Copyright The Seasar Foundation and the others 2005-2010, all rights reserved.