Perlゼミ

  1. Perl
  2. Mojolicious

Mojoliciousですべての処理の前に実行する処理をアンダーで記述する

たとえば認証などを行う場合は、すべての処理の直前で、ログインしているかどうかを確認したいと思います。このような場合はアンダーという機能を利用します。ルートからunder()でアンダーを作成して、実行したいコールバックを指定します。コールバックの戻り値が、真の場合は続きの処理を行い、偽の場合は続きの処理を行いません。

sub startup {
  my $self = shift;
  
  my $r = $self->routes;

  # 認証
  $r = $r->under(sub {
    my $self = shift;
    
    if ($self->session('login_name')) {
      return 1;
    }
    else {
      my $url = $self->req->url->to_string;
      if ($url =~ m#login$#) {
        return 1;
      }
      else {
        $self->render('denied');
        return;
      }
    }
  });

  $r->get('/')->name('index');
}

少し変な記述に見えますが、toメソッドがアンダー自体を返すので上記のような書き方が簡潔だと思います。すべてのルートでアンダーを共有するので、$r自体を上書きしてしまっています。セッションIDが発行されていない場合でログインを行うためのURL以外にアクセスした場合は、認証が拒否の知らせるテンプレートを描画するようにしています。

Mojolicious 6からの変更点

Mojolicious 6からは、ブリッジを作成するbridgeメソッドが、underメソッドに統合されています。機能は同じなので、underメソッドを使うようにしてください。

Perlプログラミングちゃんねるのご紹介

Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「今日も元気だ、Perlで元気。
ゆとりあるITエンジニアライフのために
Perl情報を前向きに発信中!」

Twitter
フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

木本システム株式会社
ご紹介キャンペーン実施中です。契約金額の10%をご紹介料としてお支払い。

(例)30万円のシステム開発委託契約が、1年続いたら、36万円がもらえる!!!