アクションクラスの実装
生成されたアクションクラスにはService
クラスを受け取るためのsetterがコメントアウトされています。既にService
クラスのインターフェイスを作成し終えているので、コメントアウトを外し、Service
クラスを受け取るようにします。また、この時点でインターフェイスの作成は終了していることから、インターフェイスに基づいた実装をすることが可能です。以下は、ListAction
の例になります。
<?php class ListAction implements S2Base_Action { private $service; public function execute(S2Base_Request $request, S2Base_View $view){ header('X-JSON: ' . $this->service->getAll()); } // ここでTabEditServiceインターフェイスを指定し、 // TabEditServiceのインスタンスを受け取ります。 public function setService(TabEditService $service){ $this->service = $service; } } ?>
この他に画面から受け取った値を保存するUpdateAction
は次のようにしました。
<?php class UpdateAction implements S2Base_Action { private $service; public function execute(S2Base_Request $request, S2Base_View $view){ $id = htmlspecialchars($request->getParam('id'), ENT_QUOTES); $title = htmlspecialchars($request->getParam('title'), ENT_QUOTES); $content = htmlspecialchars($request->getParam('content'), ENT_QUOTES); $entity = new TabEntity(); $entity->setId($id); $entity->setTitle($title); $entity->setContent($content); if(0 < $id){ $this->service->update($entity); } else { $this->service->add($entity); } } // ここでも同じくServiceを受け取ります。 public function setService(TabEditService $service){ $this->service = $service; } } ?>
ここで、お分かりかと思いますが、基本的にはAction
クラスはexecute
の処理を実装するだけです。他にも沢山のことを行うことができます。詳細はS2Base.PHP5 with Smarty フレームワークの概要を参照してください。
Diconファイルの修正
インターフェイスの作成と、実装クラス(TabEditServiceImpl
)ができあがれば、各Diconに必要なインスタンスをinjectするように修正するだけです。ほとんどの作業は、デフォルトで出力されているものに対して追記していくことで終えることができます。
TabEditService.dicon
デフォルトでは、Daoのincludeが行われていなかったので追加しました。また、アスペクトを行うような処理はありませんので、aspect
タグはコメントアウトのままにしています。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <include path="%S2BASE_PHP5_ROOT%/app/modules/tabedit/dicon/TabDao.dicon"/> <component class="TabEditServiceImpl"> <!-- <aspect></aspect> --> </component> </components>
各種アクションのDiconファイル
各種アクションのDiconファイル(AddAction.dicon
, UpdateAction.dicon
, DeleteAction.dicon
)では、TabEditServiceImpl.dicon
が読み込まれていなかったので次のようにincludeしました。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <!-- <include path="%S2BASE_PHP5_ROOT%/app/modules/tabedit/dicon/service.dicon"/> --> <include path="%S2BASE_PHP5_ROOT%/app/modules/tabedit/dicon/TabEditServic eImpl.dicon"/> <component name="Add" class="AddAction"> <!-- <aspect></aspect> --> </component> </components>
ここで、重要なのは、DIコンテナが注入するインスタンスはどこにも記述していないことです。S2Container.PHP5はメソッドに定義されているtypehint
を元に指定されたインターフェイスからインスタンスの注入を行います。
pdo.dicon(データベースへアクセスするためのDiconファイル)
データベースへアクセスするための「pdo.dicon」のdsn
などを修正する必要があります。「pdo.dicon」ファイルは、「app/commons/dicon/pdo.dicon」にあるのでこのファイルに書かれているDSNを修正します。以下は、筆者が今回作成するために使用した「pdo.dicon」の一例です。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components namespace="pdo"> <component name="dataSource" class="S2Container_PDODataSource"> <property name="dsn"> "mysql:host=localhost; dbname=codezine" </property> <property name="user">"root"</property> <property name="password">"pass"</property> <property name="option"> array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING, PDO::ATTR_AUTOCOMMIT => false); </property> </component> <component name="requiredTx" class="S2Dao_RequiredInterceptor" /> <component name="requiresNewTx" class="S2Dao_RequiresNewInterceptor" /> <component name="mandatoryTx" class="S2Dao_MandatoryInterceptor" /> <component name="neverTx" class="S2Dao_NeverInterceptor" /> <component name="notSupportedTx" class="S2Dao_NotSupportedInterceptor" /> </components>
<property name="dsn">
にはPDOで利用できるDSNを指定します。今回はmysqlドライバを使用しましたが、他の記述も可能です。S2Dao.PHP5のプロジェクトページにPDOの設定サンプルがありますので参考にしてください。
また、Goyaコマンドを使うことでDiconファイルの修正の手間も省くことが可能です。詳しくはS2Base.PHP5のプロジェクトページ内のコマンドリファレンスを参照してください。
アプリへのアクセス
「public/d.php」がデフォルトのディスパッチャとなっていますので、この「d.php」をtabedit用にコピーし、変更します。
> cp public/d.php public/tabedit.php
ここでコピーした「tabedit.php」は次のように修正を致しました(実際には不要な部分を削除しただけですが)。
<?php require_once dirname(dirname(__FILE__)).'/config/environment.inc.php'; require_once dirname( dirname(__FILE__)).'/vendor/plugins/smarty/config/environment .inc.php'; define('S2BASE_PHP5_REQUEST_MODULE_KEY','mod'); define('S2BASE_PHP5_REQUEST_ACTION_KEY','act'); // 作成したモジュール(tabedit) define('S2BASE_PHP5_DEFAULT_MODULE_NAME','tabedit'); define('S2BASE_PHP5_DEFAULT_ACTION_NAME','index'); try{ S2Base_Dispatcher::dispatch(new S2Base_RequestImpl()); } catch (Exception $e) { print "<pre><font color=\"red\">{$e->__toString()}</font></pre>\n"; } ?>
修正した部分は、S2BASE_PHP5_DEFAULT_MODULE_NAME
を作成したモジュール名「tabedit」に変更しました。tabeditのインデックスページへのアクセスは「public/tabedit.php」ページにアクセスするだけでよいです。
ローカルで実際に作業してみてください。
うまく、画面は表示されましたか?