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.
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