SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

S2Baseで作るWebアプリケーション

S2Base.PHP5とS2Dao.PHP5で作るWeb2.0風アプリケーション 後編

S2Baseで作るWebアプリケーション


  • X ポスト
  • このエントリーをはてなブックマークに追加

アクションクラスの実装

 生成されたアクションクラスにはServiceクラスを受け取るためのsetterがコメントアウトされています。既にServiceクラスのインターフェイスを作成し終えているので、コメントアウトを外し、Serviceクラスを受け取るようにします。また、この時点でインターフェイスの作成は終了していることから、インターフェイスに基づいた実装をすることが可能です。以下は、ListActionの例になります。

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は次のようにしました。

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タグはコメントアウトのままにしています。

service.dicon
<?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しました。

action.dicon
<?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」の一例です。

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コマンド
 こまで行ってきたコマンドはGoyaコマンドと呼ばれるコマンドを使うことで、一括して生成することができ、作業量を減らすことができます。
 また、Goyaコマンドを使うことでDiconファイルの修正の手間も省くことが可能です。詳しくはS2Base.PHP5のプロジェクトページ内のコマンドリファレンスを参照してください。

アプリへのアクセス

 「public/d.php」がデフォルトのディスパッチャとなっていますので、この「d.php」をtabedit用にコピーし、変更します。

ディスパッチャのコピー
> cp public/d.php public/tabedit.php

 ここでコピーした「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」ページにアクセスするだけでよいです。

 ローカルで実際に作業してみてください。

 うまく、画面は表示されましたか?

次のページ
ワンポイント

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
S2Baseで作るWebアプリケーション連載記事一覧
この記事の著者

ハタ(ハタ)

PHPの魅力に取り付かれた一人。現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。http://blog.xole.net/(ブログ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/744 2007/04/13 13:02

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング