m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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;

※認証して成功した場合にトップへ遷移可能
※そのうちきちんとした認証を実装しよう…(´・ω・`)

確認

認証していない場合は自動的にログインページへ遷移

f:id:m_shige1979:20140816080456p:plain

ログイン後はトップページヘ遷移

f:id:m_shige1979:20140816080508p:plain

まとめ

bridgeを使用することで全体の共通処理、部分的な共通処理を実装できるよう。
毎回記載するけどなんかいい方法がないかな?と思っていたのでこれは便利と思う。

適当にアプリの雛形を作成だけの場合では深く考えないので気づかないことがあるのでいろいろ探してみることは重要かと思われる