独自のアノテーションを作成したいっ!ってなったことありませんか? ( @Route, @Template のように )
例えば、Entity で CreatedAt を Annotation につけると現在時刻を付加 (→ http://www.scandio.de/2012/02/symfony2-custom-annotations/ で紹介されています)等のことが楽にできるようになります。
この独自アノテーションの作成方法を簡単にまとめておきます。
※ 以下のように、param フィールド をもつ Custom というコントローラーのアノテーションを作ることにします。
- <?php
- namespace Application\MogeraBundle\Controller;
- use Symfony\Bundle\FrameworkBundle\Controller\Controller;
- use Core\HogeBundle\Annotations\Custom;
- class DefaultController extends Controller
- {
- /**
- * @Custom(param="hogehoge")
- */
- public function indexAction()
- {
- exit();
- }
- }
① まずこの Custom クラスを作成
- <?php
- namespace Core\HogeBundle\Annotations;
- /**
- * @Annotation
- */
- class Custom
- {
- // fields
- private $param = "";
- // constructor
- public function __construct(array $data)
- {
- // アノテーションに記述した値が $data の中に入ってる
- $this->param = $data['param'];
- }
- // get value of param
- public function getParam(){
- return $this->param;
- }
- }
② アノテーションを処理するDriver部分を作成
この例では、コントローラーが呼ばれるタイミングの、onKernelController で、アノテーションを処理させます。
- <?php
- namespace Core\HogeBundle\Annotations;
- use Doctrine\Common\Annotations\Reader;
- use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
- class CustomAnnotationDriver{
- private $reader;
- public function __construct(Reader $reader)
- {
- // set annotations reader
- $this->reader = $reader;
- }
- /**
- * onKernelController
- */
- public function onKernelController(FilterControllerEvent $event)
- {
- if (!is_array($controller = $event->getController())) {
- return;
- }
- $object = new \ReflectionObject($controller[0]);// get controller
- $method = $object->getMethod($controller[1]);// get method
- // getMethodAnnotation は 第二引数に指定したアノテーションタイプにマッチしたものを返します
- // annotation reader には、アノテーションの種類によってもいくつかメソッドが用意されてるので、ソースは見ておくと良いかも
- $custom = $this->reader->getMethodAnnotation( $method, 'Core\\HogeBundle\\Annotations\\Custom' );
- if( !emptyempty($custom) ){
- print $custom->getParam(); // hogehoge と出力される
- }
- }
- }
③ service に登録 (今回は onKernelController で アノテーションを処理するので以下のように。)
また、CustomAnnotationDriver にはコンストラクタで annotation_reader で 必要とするので、arguments にそれを記述。
- services:
- hoge_annotation_driver:
- class: Core\HogeBundle\Annotations\CustomAnnotationDriver
- tags:
- - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
- arguments: [@annotation_reader]
こんな感じ。ただ、今回は print しか処理をしてないです。
参考になれば嬉しいです。
0 コメント:
コメントを投稿