2012-09-12 4 views
5

Mojolicious :: Lite를 "잘 조직 된"cpan 업로드 응용 프로그램으로 성장시키는 방법을 알려주는 Mojolicious::Guides::Growing 섹션을 읽었습니다. 먼저 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을 변경하면 하나가 아닌 두 개의 다른 파일에서 URL을 변경해야합니다. 이 : (아직) "보호"이름이 (무엇을 잘 모르겠어요하지만)

단어를 가지고
sub protected { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
} 

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

두 개의 서로 다른 파일에 4 번 "보호"

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

가로 변신 .

나는 웹 개발에 관해서는 완전히 초보자입니다.

답변

8

우수하지 않습니다. 오히려 그것은 다릅니다.

개발자 한 명을 넘기 자마자 앱을 하나의 파일로 만드는 것이 더 이상 도움이되지 않습니다. 당신은 서로의 발가락을 밟을 것입니다. 유일한 개발자 인 경우에도 1000 개 이상의 파일에있는 위치를 추적하는 것은 결코 쉬운 일이 아닙니다. 또한 하나의 파일을보고 모든 경로를 한 눈에 파악할 수 있다는 것은 100+는 물론이고 몇 가지 경로 이상을 보유하고있을 때 매우 유용합니다.

또한 경로가 변경 될 때 컨트롤러 동작에서 리디렉션 URL을 변경할 필요가 없습니다. Mojolicious는 명명 된 경로를 사용하는 경우 작업을 수행합니다.

+2

OOhhhh, redirect_to ('foo')가 경로 '/ foo'대신 이름으로 'foo'를 해석하고 M :: L get/post/any/etc 함수를 자동으로 인식하지 못했습니다. 생성 된 이름. 고마워. 고마워. – user1481

관련 문제