シンプル&パワフルなPHPライブラリ rhacoを使ってみよう!

第6回 クールなURLを実現する Urls

この記事を読むのに必要な時間:およそ 3 分

Criteriaでリレーションを扱う

Q::fact()

参照関係のあるデータを取得するとき,親テーブルのデータも同時に取得できるCriterion指定です。

例えば,Urlsで指定したリスト表示部を次のように書き換えると,テンプレート内で {$object.factCategory.name} のようにして親のオブジェクトを参照できるようになります。

    // リスト
    '^$' => array(
        'class' => 'generic.Views',
        'method' => 'read',
        'args' => array(new Todo(), new C(Q::eq(Todo::columnClose(), false), Q::fact())),
        'template' => 'list.html',
    ),

Q::depend()

参照関係のあるデータを取得するとき,子テーブルのデータも同時に取得できるCriterion指定です。

例えば,Urlsに次のように定義すると,カテゴリオブジェクトのdependTodos変数に,カテゴリを参照しているTodoオブジェクトの配列がセットされます。

Urlsの例

    '^cat/(\d+)$' => array(
        'method' => 'detail',
        'args' => array(new Category(), new C(Q::depend()))
    ),

対応するテンプレートの例(generic/category_detail.html)

<rt:extends href="../list.html" />
<rt:block name="content">
  <h2>{$object.name}</h2>
  <p><a href="{$rhaco.url('create')}">Add new todo</a></p>
  
  <table id="todo" rt:param="{$object.dependTodos}" rt:var="todo">
  
 (以下省略)

まとめ

このように,UrlsとViewsを組み合わせると,URLのマッピング定義とテンプレートだけで簡単なアプリであればすぐに作成できてしまいます。

参考資料

これまで開発してきたアプリケーションのソースコードをgithub上にアップロードしました。多少発展的なコードも含めてみたので,ぜひ挑戦してみてください。

gitクライアントからのアクセスのほか,zipやtgzでのダウンロードも可能です。

著者プロフィール

佐藤佳祐(さとうけいすけ)

北海道の大学に在籍し,現在は絶賛就職活動中。nequalに所属し,PEARリポジトリサービス「Openpear」開発を担当。最近はrhaco2と格闘する日々。お仕事の話,待ってます。

URLhttp://riaf.jp/

コメント

コメントの記入