■
SabelのAspect機能を使うと、簡単にAOPが可能になる。
PHPのAOPだと、http://www.phpaspect.org/とかもあるが、この方式は少々大袈裟なかんじがする。
SabelのAspectは完全に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月リリース予定。