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をグルーピング化し再利用しやすくします。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. |