2012年4月1日日曜日

独自のアノテーションを作成する

独自のアノテーションを作成したいっ!ってなったことありませんか? ( @Route, @Template のように )
例えば、Entity で CreatedAt を Annotation につけると現在時刻を付加 (→ http://www.scandio.de/2012/02/symfony2-custom-annotations/ で紹介されています)等のことが楽にできるようになります。


この独自アノテーションの作成方法を簡単にまとめておきます。

※ 以下のように、param フィールド をもつ Custom というコントローラーのアノテーションを作ることにします。

  1. <?php  
  2.   
  3. namespace Application\MogeraBundle\Controller;  
  4.   
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;  
  6. use Core\HogeBundle\Annotations\Custom;  
  7.   
  8. class DefaultController extends Controller  
  9. {  
  10.    /** 
  11.      * @Custom(param="hogehoge") 
  12.      */  
  13.     public function indexAction()  
  14.     {  
  15.   exit();  
  16.     }  
  17. }  


① まずこの Custom クラスを作成
  1. <?php  
  2. namespace Core\HogeBundle\Annotations;  
  3.   
  4. /** 
  5. * @Annotation 
  6. */  
  7. class Custom  
  8. {  
  9.     // fields  
  10.     private $param = "";  
  11.       
  12.     // constructor  
  13.     public function __construct(array $data)  
  14.     {  
  15.         // アノテーションに記述した値が $data の中に入ってる  
  16.         $this->param = $data['param'];  
  17.     }  
  18.   
  19.     // get value of param  
  20.     public function getParam(){  
  21.          return $this->param;  
  22.     }  
  23. }  


② アノテーションを処理するDriver部分を作成
この例では、コントローラーが呼ばれるタイミングの、onKernelController で、アノテーションを処理させます。
  1. <?php  
  2.   
  3. namespace Core\HogeBundle\Annotations;  
  4.   
  5. use Doctrine\Common\Annotations\Reader;  
  6. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;  
  7.   
  8. class CustomAnnotationDriver{  
  9.   
  10.     private $reader;  
  11.   
  12.     public function __construct(Reader $reader)  
  13.     {  
  14.         // set annotations reader  
  15.         $this->reader = $reader;  
  16.     }  
  17.   
  18.     /** 
  19.      * onKernelController 
  20.      */  
  21.     public function onKernelController(FilterControllerEvent $event)  
  22.     {  
  23.         if (!is_array($controller = $event->getController())) {  
  24.             return;  
  25.         }  
  26.   
  27.         $object = new \ReflectionObject($controller[0]);// get controller  
  28.         $method = $object->getMethod($controller[1]);// get method  
  29.           
  30.         // getMethodAnnotation は 第二引数に指定したアノテーションタイプにマッチしたものを返します  
  31.         // annotation reader には、アノテーションの種類によってもいくつかメソッドが用意されてるので、ソースは見ておくと良いかも  
  32.         $custom = $this->reader->getMethodAnnotation( $method'Core\\HogeBundle\\Annotations\\Custom' );  
  33.         if( !emptyempty($custom) ){  
  34.             print $custom->getParam(); // hogehoge と出力される  
  35.         }  
  36.     }  
  37. }  


③ service に登録 (今回は onKernelController で アノテーションを処理するので以下のように。)
また、CustomAnnotationDriver にはコンストラクタで annotation_reader で 必要とするので、arguments にそれを記述。
  1. services:  
  2.     hoge_annotation_driver:  
  3.         class: Core\HogeBundle\Annotations\CustomAnnotationDriver  
  4.         tags:  
  5.             - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }  
  6.         arguments: [@annotation_reader]  



こんな感じ。ただ、今回は print しか処理をしてないです。
参考になれば嬉しいです。

0 コメント:

コメントを投稿

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites More