Sledge::Sessionに便利なアクセサ追加するには

| コメント(2) | トラックバック(0)
subtechグループ - tokuhiromの日記 - Sledge::SessionManager にアクセサ追加 User の ID をセッションに入れとく場合、

my $user = Project::Data::User->retrieve($self->session->param('id'));

とか毎回書くのはダルいので

my $user = $self->session->user;

と書きたいのだが

確かに。セッションから直で取れるのを設定できると楽だな~。宮川さんがコメントしているように簡単にSledge::Sessionに追加できるプラグインがあってもいいと思いますが、今のところ自分がよくやる方法としては下記の2つの方法があります。

  • 方法1:Authorizerに定義する
  • Project::Authorizer::Loginとかで認証する際に、
    sub authorize {
        #...
        my $user = Project::Data::User->retrieve($user_id);
        $self->session->param(user => $user);
        #...
    }

    という様にしてセッションにuserという名前でProject::Data::Userオブジェクトを入れてしまう。そしてProject::Pages::Baseとか作って、

    sub user {
        my $self = shift;
        $self->session->param('user');
    }

    と定義しておいて、Pagesクラスは全部これを継承して作るようにすれば、Pagesクラスでは$self->userで取れるようになる。

  • 方法2:Project::Pages::Baseに定義

  • Authorizerとかで定義するのもメンドイなぁと思うときは、上記の方法をちょと変更してProject::Pages::Baseに

    use Project::Data::User;
    sub user {
        my $self = shift;
        my $id = $self->session->param('user_id');
        $self->session->param(user => Project::Data::User->retrieve($id))
            if $id && !$self->session->param('user');
        return $self->session->param('user');
    }

    と定義して、セッションにuser_idというのがあったらそれを元にProject::Data::Userオブジェクトをretrieveしてきて、userというセッションに入れてそれをリターンするって方法。
    微妙に、なんでもかんでもuser_idってセッションがあったらretrieveしちゃうので、作ってるアプリでuser_idが絶対ユーザIDだという保証がない場合は危険なのでやめた方がいいですね…。

この2つの方法の弱点としたら、Pages以外のクラスではPagesが渡ってなければ$self->userが取れないというところ。といってもそもそもPagesクラスが取れなけりゃセッションも取れないわけで…、$self->session->userとかもできないか…。

追記:
コメントにも書きましたが、SledgeではどこでもPagesを取れるような機構が用意されてるのを失念していました。取り方は下記のようにします。

my $page = Sledge::Registrar::context();

トラックバック(0)

トラックバックURL: http://blog.clouder.jp/mt/mt-tb.cgi/538

コメント(2)

Pagesのコンテキストをとる方法があったような。
Your::Page->context?

あ、そうだ。取れますね。
my $page = Sledge::Registrar::context();
でしたね。

コメントする

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja