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();