Edited at

bridgeを活用する

More than 5 years have passed since last update.

MojoliciousのRoutingの中に「 bridge 」というモノのがあります。共通で使うアクションをコントローラの一つのメソッドにしてそこを一度経由してから他のコントローラ処理を行うことが出来ます。主なユースケースとしてユーザー認証などが考えられるでしょう。では使ってみます。Mojolicious を継承した MyApp.pm は以下のようになります。


lib/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::Rootloginメソッド で定義するとしています。Routeオブジェクトを $logged_in という変数で保持しつつ / パスへのアクセスは MyApp::Rootindexメソッド へ通しています。

ではコントローラ。


lib/MyApp/Root.pm

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は便利でしょうね!

なお、ただいま絶賛、料理の途中なので飯写真はありません