アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

symfony+S2Container.PHP5

はじめまして。7月に入社した濱田です。

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

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

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

まずはControllerとModelが同じクラス内に含まれるActionクラスの例です。
[Actioクラス]


<?php
class informationActions extends sfActions
{
  protected $_recordName = 'DbInformation';
  
  public function executeList()
  {
    $model = $this->_recordName;
    $pager = new sfDoctrinePager($model, 30);


    $q = Doctrine_Query::create()->from('DbInformation i')
                          ->Where('i.disp_flg = 1');

    $q->orderBy('disp_time DESC');

    $pager->setQuery($q);
    $pager->setPage($this->getRequestParameter('page', 1));
    $pager->init();
    $this->pager = $pager;
  }
}


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

[Infoクラス]


<?php
class Info
{
  public function createList()
  {
    $model = 'DbInformation'
    $pager = new sfDoctrinePager($model, 30);


    $q = Doctrine_Query::create()->from('DbInformation i')
                          ->Where('i.disp_flg = 1');

    $q->orderBy('disp_time DESC');

    $pager->setQuery($q);
    $pager->setPage($this->getRequestParameter('page', 1));
    $pager->init();
    
    return $pager;
  }
}

[Actionクラス]


<?php
class informationActions extends sfActions
{
  protected $_recordName = 'DbInformation';

  public function executeList()
  {
    S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
  
    $info = $container->getComponent('Info');
    $this->pager = $info->createList();
  }
}


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

[Actionクラス]でS2Container使ってみた行の説明です。
7行目 クラスファイルのインポートを行います。


<?php
S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');


9行目 コンポーネントの取得をします。


<?php
$info = $container->getComponent('Info'); 


10行目 InfoクラスのcreateListメソッドを呼び出しpagerオブジェクトを取得します。


<?php
$this->pager = $info->createList(); 


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