切り抜き詳細

発行日時
2008-10-2 16:31
見出し
symfony+S2Container.PHP5
リンクURL
http://blog.asial.co.jp/460 symfony+S2Container.PHP5への外部リンク
記事詳細
はじめまして。7月に入社した濱田です。

今日はMVCフレームワークを提供しているsymfonyとJavaでよく使われてるような気がするSeasar2からS2Container.PHP5を組み合わせて使ってみようと思います。

symfony+S2Container.PHP5で開発をしようと思っている人はごめんなさい。今回は動作確認をしてみた程度でsymfony+S2Container.PHP5の使い道に付いては書いてないです。

今回の目的はsymfonyのController内に書かれたModel部分をクラス単位で切り出しS2Containerからコンポーネントを取得し、Viewに渡すところまでを書く事によってsymfony+S2Containerの環境を作り今後Model部分の流用率UPを考えてみます。

まずはControllerとModelが同じクラス内に含まれるActionクラスの例です。
[Actioクラス]
  1. <?php
  2. class informationActions extends sfActions
  3. {
  4.   protected $_recordName = 'DbInformation';
  5.   
  6.   public function executeList()
  7.   {
  8.     $model = $this->_recordName;
  9.     $pager = new sfDoctrinePager($model, 30);
  10.  
  11.  
  12.     $q = Doctrine_Query::create()->from('DbInformation i')
  13.                           ->Where('i.disp_flg = 1');
  14.  
  15.     $q->orderBy('disp_time DESC');
  16.  
  17.     $pager->setQuery($q);
  18.     $pager->setPage($this->getRequestParameter('page', 1));
  19.     $pager->init();
  20.     $this->pager = $pager;
  21.   }
  22. }

次にModel部分をInfoクラスとして切り出した例です。

[Infoクラス]
  1. <?php
  2. class Info
  3. {
  4.   public function createList()
  5.   {
  6.     $model = 'DbInformation'
  7.     $pager = new sfDoctrinePager($model, 30);
  8.  
  9.  
  10.     $q = Doctrine_Query::create()->from('DbInformation i')
  11.                           ->Where('i.disp_flg = 1');
  12.  
  13.     $q->orderBy('disp_time DESC');
  14.  
  15.     $pager->setQuery($q);
  16.     $pager->setPage($this->getRequestParameter('page', 1));
  17.     $pager->init();
  18.     
  19.     return $pager;
  20.   }
  21. }
[Actionクラス]
  1. <?php
  2. class informationActions extends sfActions
  3. {
  4.   protected $_recordName = 'DbInformation';
  5.  
  6.   public function executeList()
  7.   {
  8.     S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
  9.   
  10.     $info = $container->getComponent('Info');
  11.     $this->pager = $info->createList();
  12.   }
  13. }

Actionクラス内にあったぺージャーオブジェクトの取得とDBからのデータ取得部分をInfoクラスに切り出し、Actionクラス内はModelからViewへPagerオブジェクトの受け渡しのみを記述することによってMVCを明確に別けました。

[Actionクラス]でS2Container使ってみた行の説明です。
7行目 クラスファイルのインポートを行います。
  1. <?php
  2. S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');

9行目 コンポーネントの取得をします。
  1. <?php
  2. $info = $container->getComponent('Info');

10行目 InfoクラスのcreateListメソッドを呼び出しpagerオブジェクトを取得します。
  1. <?php
  2. $this->pager = $info->createList();

S2Containerのさわりだけ触ってみたわけですが、lib内にクラスを定義するだけMVCの切り分けは出来るわけでS2Containerを使うメリットはまだまだ見えない。。
Seasar2の導入自体はpaerからsymfonyのプラグインとしてインストールするだけなので簡単に導入はできました、今回は環境構築と動作確認が出来たからいいとします。
今後symfonyアーキテクチャにあったDIの書き方を考える事によりプロジェクトに特化しない標準化を模索したいです。