2012-09-12 8 views
5

私はMojolicious::Guides::Growingのセクションを読んでいます。Mojolicious :: Liteを「うまく構成された」cpan-uploadableアプリケーションに成長させる方法を教えています。まず、M :: Lアプリを起動スクリプトとアプリケーションクラスに分割するように指示します。mojoliciousでルーティングとコントローラの動作を分離するのはなぜですか?

package MyApp; 
use Mojo::Base 'Mojolicious'; 

use MyUsers; 

sub startup { 
    my $self = shift; 

    # ...auth stuff omitted... 

    my $r = $self->routes; 
    $r->any('/' => sub { 
    my $self = shift; 

    my $user = $self->param('user') || ''; 
    my $pass = $self->param('pass') || ''; 
    return $self->render unless $self->users->check($user, $pass); 

    $self->session(user => $user); 
    $self->flash(message => 'Thanks for logging in.'); 
    $self->redirect_to('protected'); 
    } => 'index'); 

    $r->get('/protected' => sub { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
    }); 

    $r->get('/logout' => sub { 
    my $self = shift; 
    $self->session(expires => 1); 
    $self->redirect_to('index'); 
    }); 
} 

1; 

これは意味があります。

package MyApp::Login; 
use Mojo::Base 'Mojolicious::Controller'; 

sub index { 
    my $self = shift; 

    my $user = $self->param('user') || ''; 
    my $pass = $self->param('pass') || ''; 
    return $self->render unless $self->users->check($user, $pass); 

    $self->session(user => $user); 
    $self->flash(message => 'Thanks for logging in.'); 
    $self->redirect_to('protected'); 
} 

sub protected { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
} 

sub logout { 
    my $self = shift; 
    $self->session(expires => 1); 
    $self->redirect_to('index'); 
} 

1; 

package MyApp; 
use Mojo::Base 'Mojolicious'; 

use MyUsers; 

sub startup { 
    my $self = shift; 

    # ...auth stuff omitted... 

    my $r = $self->routes; 
    $r->any('/')->to('login#index')->name('index'); 
    $r->get('/protected')->to('login#protected')->name('protected'); 
    $r->get('/logout')->to('login#logout')->name('logout'); 
} 

1; 

私はなぜこれが表示されていない。しかし、それは、このアプリケーションのクラスは、さらにアクションがコントローラクラスにリファクタリングすることができ、およびアプリケーション・クラス自体は、ルーティング情報に減らすことができると言うことになりますコントローラのredirect_to()でアクション間をリダイレクトするために、別のファイルでルーティング情報を調べる必要があるため、ルートとアクションが混在している "ハイブリッド"バージョンより優れています。 URLを変更するには、1つではなく2つの異なるファイルで行う必要があります。この:(私はまだ)「保護」の名前は(何をするかわからないが)

単語を持ってい
sub protected { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
} 

$r->get('/protected')->to('login#protected')->name('protected'); 

2つの異なるファイルに4回を「保護」:

$r->get('/protected' => sub { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
    }); 

は変身します。

ところで、私はWeb開発については完全な初心者です。

答えて

8

これは優れていません。むしろ、それは違う。

1人の開発者を超えて移動すると、アプリを1つのファイルにまとめても効果がなくなります。あなたはお互いのつま先を踏んで終わるでしょう。あなたが唯一の開発者であっても、1000以上のファイルの場所を追跡することは決して容易ではありません。さらに、1つのファイルを見て、すべてのルートを一目で判断できることは、100以上のルートだけでなく、ルートが数以上ある場合にも非常に便利です。

また、ルートが変更されたときにコントローラアクションでリダイレクトURLを変更する必要はありません。あなたが名前付きルートを利用しているなら、Mojoliciousはあなたのために仕事をします。

+2

私は、redirect_to( 'foo')がパス '/ foo'の代わりに名前として 'foo'を解釈し、M :: L get/post/any/etc関数が自動的に実行されることを認識しませんでした作成された名前。それは今、感謝します、ありがとう。 – user1481

関連する問題