twitter sns クチコミ comments neta

2007/10/03 21:06:08

日記を実装してみるよ!

rhaco修行シリーズ!

そろそろ自分でもよくわからなくなってきました!w


Urlsを使う


日記では、今までとはちょっと方向性を変えて、rhacoのUrlマッパ?のurlsを使ってみます。
Urlsを使うと、エントリポイントを複数持たなくても、簡単にアクションを定義することができます。
また、rhacoの強力なgenericの機能を使用すると、実際のコーディング量をものすごく減らすことが出来ます。

最終的には、全部の機能をUrlsを使って書き直してみたりしてみたいですねぇ。

SNSでは、ユーザー別の投稿が存在するので、user_id毎にリストを用意するなどしないと駄目ですよね。
rhacoではこの作業もものすごく簡単にできます。
今回は、Urlsで用いるgeneric.Viewsを継承したクラスを作成することにしました。(Viewsの説明もしなきゃですかね?><)
library/rhacosns.phpを以下のように作成しました。
<?php
Rhaco::import("generic.Views");
Rhaco::import("model.User");
Rhaco::import("model.Diary");
Rhaco::import("model.Friend");

class rhacosns extends Views
{
    function diaryList($user_id = 0){
        if($user_id == 0){
            $user = RequestLogin::getLoginSession();
            $user_id = $user->getId();
        }
        $parser = $this->read(new Diary(), new C(Q::eq(Diary::columnUserId(), $user_id), Q::orderDesc(Diary::columnModified())));
        $parser->setVariable('user', $this->dbUtil->get(new User(), new C(Q::eq(User::columnId(), $user_id))));
        return $parser;
    }

    function diaryDetail($user_id = 0, $diary_id = 0){
        $parser = $this->detail(new Diary(), new C(Q::eq(Diary::columnUserId(), $user_id)), 1);
        $parser->setVariable('user', $this->dbUtil->get(new User(), new C(Q::eq(User::columnId(), $user_id))));
        return $parser;
    }
}

クラスだけ用意してもわかりにくいので、先にdiary.phpも貼り付けておきます。
<?php
require_once '__init__.php';
Rhaco::import('network.http.RequestLogin');
Rhaco::import('network.http.Header');
Rhaco::import("generic.Urls");
Rhaco::import("generic.Views");
Rhaco::import("network.http.Http");
Rhaco::import("tag.feed.FeedParser");
Rhaco::import("rhacosns");

Rhaco::constant("HTML_CSRF_FILTER", true);

if(!RequestLogin::isLogin()){
	Header::redirect(Rhaco::url('login.php'));
}
$user = RequestLogin::getLoginSession();

$pattern = array(
    "^$" => array('template' => Rhaco::constant('TEMPLATE') . '/diary_list.html', 'class' => 'rhacosns', 'method' => 'diaryList'),
    "^post$" => array(Rhaco::constant('TEMPLATE') . '/diary_form.html', null, 'create', array(new Diary(), Rhaco::page('diary') . '/' .$user->getId())),
    "^([0-9]+)$" => array('template' => Rhaco::constant('TEMPLATE') . '/diary_list.html', 'class' => 'rhacosns', 'method' => 'diaryList'),
    "^([0-9]+)\/([0-9]+)$" => array('template' => Rhaco::constant('TEMPLATE') . '/diary_detail.html', 'class' => 'rhacosns', 'method' => 'diaryDetail'),
);

$db = new DbUtil(Diary::connection());
$parser = Urls::parser($pattern, $db);
$parser->setVariable('login', $user);
$parser->write();

前回同様にログインのチェックのあと、Urlsに渡すパターンを正規表現をキーにした配列で定義します。
Urlsパターンの書き方はいろいろあるのですが、それについては今回説明しません(というか、自分も把握できてません><!誰か教えて><)
まず、diary.phpにそのままアクセスしてきた場合を"^$"でマッチさせます。この場合、上記のrhacosnsクラスのdiaryListメソッドを呼びます。diaryListメソッドではIDを定義しない場合自分の日記のリストを表示することにしました。
次に"^post$"で、diary.php/postへのアクセスをマッチさせます。ここではフォームを表示します。クラスの指定をnullにすると、rhaco標準のViewsMapperが呼ばれます。Viewsのcreateはinsertも面倒見てくれるので、便利です。
そして"^([0-9]+)$"でな、diary.php/USER_IDへのアクセスからUSER_IDを取得して、rhacosnsのDiaryListメソッドにキーで定義した正規表現で得た値を渡します。こうすることで、簡単にユーザー別の日記一覧を作成できます。
"^([0-9]+)\/([0-9]+)$"はdiary.php/USER_ID/DIARY_IDをマッチさせます。rhacosnsのdiaryDetailメソッドに二つの値を渡しますが、Viewsのdetailでは、primary_keyがPATH_INFOを/で区切った何番目に指定されているかを第三引数で設定してやれば自動的にクエリを生成してくれます。DIARY_IDは2番目に出てくるので、配列の数え方(?? 0から数えますよね)でいうと1になります。diaryDetailではそれに加えてUSER_IDの条件もdetailに与えています。


対応するテンプレートを用意する。


継承を使って簡単に済ましてしまいましょう!
記事に書くと長くなるので、SVN見てみてくださいw
http://svn.riaf.org/rana/rhacosns/trunk/resources/templates/cdp


ちょっと今回はわかりにくかったかも知れないですね。。。
日本語って難しいです><

  • Add Comment

    name:

    comment:

    question:
    1 + 1 = ?
    answer: