2012-09-12 19 views
5

Estoy leyendo la sección de Mojolicious::Guides::Growing donde le dice cómo hacer crecer un Mojolicious :: Lite en una aplicación "bien organizada" cargada en el dispositivo móvil. En primer lugar, le dice que divida la aplicación M :: L en un script de inicio y una clase de aplicación.¿Por qué separar las acciones de enrutamiento y controlador en 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; 

Esto tiene sentido para mí. Pero entonces se llega a decir que esta clase de aplicación puede además ser reprogramado para una clase controlador con las acciones, y la propia clase de aplicación se puede reducir a la información de enrutamiento:

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; 

no veo por qué esto es superior a la versión "híbrida" donde las rutas y acciones se entremezclan, porque ahora para redireccionar entre las acciones con redirect_to() en el controlador, necesita ver la información de enrutamiento en un archivo diferente, y si desea cambie una url, tiene que hacerlo en dos archivos diferentes en lugar de uno. Este:

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

se convierte en:

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

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

que tiene la palabra "protegido" 4 veces en dos archivos diferentes (aunque no estoy seguro de lo que hace el nombre ("protegido") aún) .

Soy un completo novato en lo que respecta al desarrollo web, por cierto.

Respuesta

8

No es superior; más bien, es diferente.

Tan pronto como se mueve más allá de un desarrollador, tener su aplicación en un archivo ya no es un beneficio; terminarás pisándote los dedos del pie. Incluso si eres el único desarrollador, nunca es fácil realizar un seguimiento de las ubicaciones en archivos de más de 1000 líneas. Además, poder mirar un archivo y determinar todas tus rutas de un vistazo es bastante útil cuando tienes más que unas pocas rutas, sin mencionar las más de 100.

Además, no es necesario cambiar una url de redirección en una acción de controlador cuando la ruta cambia. Mojolicious hará el trabajo por usted si está utilizando rutas con nombre.

+2

OOhhhh, no me di cuenta de que redirect_to ('foo') interpretó 'foo' como un nombre en lugar de como la ruta '/ foo', y que las funciones M :: L get/post/any/etc automáticamente nombres creados Todo tiene sentido ahora, gracias. – user1481

Cuestiones relacionadas