MojoliciousのRoutingの中に「 bridge 」というモノのがあります。共通で使うアクションをコントローラの一つのメソッドにしてそこを一度経由してから他のコントローラ処理を行うことが出来ます。主なユースケースとしてユーザー認証などが考えられるでしょう。では使ってみます。Mojolicious
を継承した MyApp.pm
は以下のようになります。
package MyApp;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
my $logged_in = $r->bridge->to('root#login');
$logged_in->get('/')->to('root#index');
}
1;
ここではログイン処理をするようなアクションを MyApp::Root
の loginメソッド
で定義するとしています。Routeオブジェクトを $logged_in
という変数で保持しつつ /
パスへのアクセスは MyApp::Root
の indexメソッド
へ通しています。
ではコントローラ。
package MyApp::Root;
use Mojo::Base 'Mojolicious::Controller';
sub index {
my $self = shift;
$self->render(text => 'You are logged-in!');
}
sub login {
my $self = shift;
my $password = $self->param('password');
return 1 if $password && $password eq 'password';
$self->render( text => 'Your password is "password"' );
return undef;
}
1;
肝心なのは loginメソッド
でパスワードが合っているか?どうかの判断をしたあと。 真値を返す ことでbridgeで定義した次のアクションである indexメソッド
に移ります。逆に 偽を返した 時には処理はそこで終わります。この場合だと Your password is "password"
とテキストを表示するにとどまります。
「真偽を判断してbrigedの次のアクションへ行く」ことを把握していればbridgeは便利でしょうね!
なお、ただいま絶賛、料理の途中なので飯写真はありません