Mojoliciousで表示前の共通処理(bridge)
bridge
Mojoliciousで各ページを表示する前にhtmlのタイトルなどの共通設定を各ページで定義するのが無駄な感じがする場合に処理をするところ。これを使用することで認証チェックなども実施可能
構成
[vagrant@localhost sample_web]$ tree . ├── lib │ └── Sample │ ├── Web │ │ ├── Example.pm │ │ ├── Root.pm │ │ ├── Test1.pm │ │ └── User.pm │ └── Web.pm ├── log │ └── development.log ├── public │ ├── css │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ └── user.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ ├── index.html │ └── js │ ├── bootstrap.js │ ├── bootstrap.min.js │ └── jquery-2.1.1.min.js ├── script │ └── sample_web ├── t │ └── basic.t └── templates ├── example │ └── welcome.html.ep ├── layouts │ └── default.html.ep ├── test1 │ ├── conf.html.ep │ ├── index.html.ep │ └── post.html.ep └── user └── index.html.ep 15 directories, 29 files [vagrant@localhost sample_web]$
routerで事前にbridgeを指定
lib/Sample/Web.pm
package Sample::Web; use Mojo::Base 'Mojolicious'; # This method will run once at server start sub startup { my $self = shift; # Documentation browser under "/perldoc" $self->plugin('PODRenderer'); # Router my $r = $self->routes; # 共通処理 my $init = $r->bridge->to('root#init'); # ログイン制御ページ my $login = $init->bridge->to('user#init'); $login->get('/login')->to('user#index'); $login->post('/login')->to('user#login'); $login->get('/logout')->to('user#logout'); # 認証チェック my $auth = $init->bridge->to('root#auth'); # 認証後アクセスできる処理 $auth->get('/')->to('example#welcome'); $auth->get('/test1')->to('test1#index'); $auth->get('/test1/new')->to('test1#post'); $auth->post('/test1/conf')->to('test1#conf'); $auth->post('/test1/create')->to('test1#create'); } 1;
lib/Sample/Web/Root.pm
package Sample::Web::Root; use Mojo::Base 'Mojolicious::Controller'; # 初期処理 sub init { my $self = shift; # 共通で使用する変数を設定する $self->stash->{title} = "aaaa"; } # 認証チェック処理 sub auth { my $self = shift; # セッションのauthが設定されているかチェックする if($self->session->{auth}){ return 1; }else{ $self->redirect_to('/login'); } return undef; } 1;
※共通処理として初期処理や認証チェックなどを定義し、bridgeで指定する
一応、超適当な認証
lib/Sample/Web/User.pm
package Sample::Web::User; use Mojo::Base 'Mojolicious::Controller'; # ログイン共通 sub init { my $self = shift; # ログイン処理独自のcssを設定 $self->stash->{cssfiles} = ["user"]; } # ログインページ sub index { my $self = shift; # セッションをすべて破棄 $self->session(expires => 1); # view適用 $self->render(); } # ログイン処理 sub login { my $self = shift; my $login = $self->param('login'); my $password = $self->param('password'); # きちんとした認証処理はそのうち実装 if($login eq "root" && $password eq "password"){ # session $self->session->{auth} = { user => 'root' }; # ログイン成功後はTOPへ遷移 $self->redirect_to('/'); }else{ # ログイン画面へ戻る $self->redirect_to('/login'); } } # ログアウト処理 sub logout { my $self = shift; # セッションをすべて破棄 $self->session(expires => 1); # ログイン成功後はTOPへ遷移 $self->redirect_to('/login'); } 1;
※認証して成功した場合にトップへ遷移可能
※そのうちきちんとした認証を実装しよう…(´・ω・`)
確認
認証していない場合は自動的にログインページへ遷移
ログイン後はトップページヘ遷移
参考
http://d.hatena.ne.jp/perlcodesample/20101112/1278596435
http://qiita.com/yusukebe/items/9f755d17a3a1b657a8b6
まとめ
bridgeを使用することで全体の共通処理、部分的な共通処理を実装できるよう。
毎回記載するけどなんかいい方法がないかな?と思っていたのでこれは便利と思う。
適当にアプリの雛形を作成だけの場合では深く考えないので気づかないことがあるのでいろいろ探してみることは重要かと思われる