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