前回解説したViewsをつかうと、簡単なアプリケーションの作成ならばメソッド一つで実現できるようになりました。
今回は、ViewsとUrlsを組み合わせて、URLを自在に設計してみます。また、まとめとして今まで開発してきたすべてのソースのリポジトリを作成してみました。
Urlsとは
CakePHPなど、最近のフレームワークでは標準で搭載されている「Cool URI」と呼ばれるようなURI設計を可能にするライブラリです。
正規表現を使って、自由自在にURLの設計ができるようになります。
Urlsをつかう
使い方は非常に簡単です。Urlsクラスのparserメソッドに、URLマッピングの配列を引数として渡すと、UrlsがURLを解析して該当するアクションを実行し、HtmlParserのインスタンスを返却します。
使用例
ここでは、TodoモデルのCRUDを実現する簡単な定義を紹介します。
Urlsで指定できる値は次の通りです。
値 | 意味 |
class | 実行するメソッドを持つクラス |
method | 実行するメソッド名 |
args | メソッドに渡す引数 |
template | テンプレート名 |
var | 追加でテンプレートにセットする値 |
この状態でindex.phpにアクセスすると、PATH_INFOに何もセットされていないので一番最初に定義した‘^$’の部分にマッチし、一覧画面が表示されます。
つぎに、Apacheの場合はmod_rewriteの設定を行います。mod_rewriteに関しては、rhacoのセットアップにて設定を自動で書き出すことができます。
setup/project.xmlの最初の行を次のように書き換えます。
変更後、setup.phpにアクセスすると初期処理を実行するボタンが出現します。
このボタンをクリックすると、アプリケーションのルートパス上にmod_rewriteの設定が記述された以下のような.htaccessが出力されます。
完了ボタンを作成する
作成したTODOを完了するためには、本来であれば専用のクラスとメソッドを作ってアクションを実現することになりますが、ここでは少し工夫してUrls+Viewsの機能だけで完了のアクションを作成してみます。
先に述べたUrlsの指定にupdateの項目が既にあるので、強引ですがテンプレートの変更で対応します。
このように、http://localhost/kaeru/update に対して、closeフラグを強制的に1(true)にしてカラムを更新させると、一覧に表示されないようになります。
Criteriaでリレーションを扱う
Q::fact()
参照関係のあるデータを取得するとき、親テーブルのデータも同時に取得できるCriterion指定です。
例えば、Urlsで指定したリスト表示部を次のように書き換えると、テンプレート内で {$object.factCategory.name} のようにして親のオブジェクトを参照できるようになります。
Q::depend()
参照関係のあるデータを取得するとき、子テーブルのデータも同時に取得できるCriterion指定です。
例えば、Urlsに次のように定義すると、カテゴリオブジェクトのdependTodos変数に、カテゴリを参照しているTodoオブジェクトの配列がセットされます。
まとめ
このように、UrlsとViewsを組み合わせると、URLのマッピング定義とテンプレートだけで簡単なアプリであればすぐに作成できてしまいます。
参考資料
これまで開発してきたアプリケーションのソースコードをgithub上にアップロードしました。多少発展的なコードも含めてみたので、ぜひ挑戦してみてください。
gitクライアントからのアクセスのほか、zipやtgzでのダウンロードも可能です。