4.4. S2Containerを用いてAspectする

4.4.1. S2ApplicationContextを使用する

S2ApplicationContextを用いてコンポーネントにアスペクトする場合は、自動アスペクトを設定するか、 各クラスでコメントアノテーションを設定する方法があります。

自動アスペクトを設定する. 

S2ApplictionContextの自動アスペクト機能を使用する場合は、S2ApplictionContext::registerAspectメソッドでアスペクトを設定します。
例として、次のようなサービスクラスにAspectを適用してみます。

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

S2ApplicationContext::importメソッドでServiceクラスをインポートします。S2ApplicationContext::createメソッドで コンテナを生成し、getComponentメソッドでServiceコンポーネントを取得します。

<?php
require_once('S2Container/S2Container.php');
seasar\container\S2ApplicationContext::import(dirname(__FILE__) . '/classes');
seasar\container\S2ApplicationContext::registerAspect('new seasar\aop\interceptor\TraceInterceptor', '/^Service$/', '^add$');
$container = seasar\container\S2ApplicationContext::create();
$service   = $container->getComponent('Service');

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

S2ApplicationContext::registerAspectメソッドの引数で、アスペクトを適用するコンポーネント名やInterceptor、Pointcutを設定します。


コメントアノテーションで設定する. 

コメントアノテーションでアスペクト設定を記述する場合は、@S2Aspectアノテーションを用います。 @S2Aspectアノテーションはクラスまたはメソッドに記述することができます。

例として、サービスクラスにAspectを適用してみます。クラスにアノテーションを記述する場合は次のようになります。

/**
 * @S2Aspect('interceptor' => 'new seasar\aop\interceptor\TraceInterceptor',
 *           'pointcut'    => '^add$')
 */
class Service {
    public function add($a, $b) {
        return $a + $b;
    }
}

メソッドにアノテーションを記述する場合は次のようになります。pointcutは省略できます。

class Service {
    /**
     * @S2Aspect('interceptor' => 'new seasar\aop\interceptor\TraceInterceptor')
     */
    public function add($a, $b) {
        return $a + $b;
    }
}

S2ApplicationContext::importメソッドでServiceクラスをインポートします。S2ApplicationContext::createメソッドで コンテナを生成し、getComponentメソッドでServiceコンポーネントを取得します。

<?php
require_once('S2Container/S2Container.php');
seasar\container\S2ApplicationContext::import(dirname(__FILE__) . '/classes');
$container = seasar\container\S2ApplicationContext::create();
$service   = $container->getComponent('Service');

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

4.4.2. S2ContainerFactoryを使用する

S2ContainerFactoryを使用する場合は、S2Containerの定義ファイルであるダイコンファイルで、aspectタグを用いてアスペクト設定を行います。
例として、次のようなサービスクラスにアスペクトを行います。

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

アスペクトをコンポーネントに組み込みます。aspectタグのボディでInterceptorの名前を指定します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
    <component name="trace" class="seasar\aop\interceptor\TraceInterceptor"/>
    <component class="Service">
        <aspect pointcut="^add$">trace</aspect>
    </component>
</components>

S2ContainerFactoryのcreateメソッドで上記ダイコンファイルを指定して、コンテナを生成します。

<?php
require_once('S2Container/S2Container.php');
seasar\util\ClassLoader::import(dirname(__FILE__) . '/classes');
$container = seasar\container\factory\S2ContainerFactory::create('/path/to/diconファイル');
$service   = $container->getComponent('Service');

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


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