preiddy estaba escribiendo un
tutorial de Catalyst, en este mismo subforo (lo ha tenido que aparcar por problemas personales).
Yo me comprometo a hacer uno de Mojolicious, este año
¿Te animas a hacer uno de C::A?
Yo he hecho dos aplicaciones con C::A y, al final, me salé que he tenido que escribir mucho código. Aunque en el segundo usé algunos complementos de C::A, aún así tuve que escribir muchas líneas burocráticas para intercambiar información entre subrutinas, o decodificar todos los parámetros que llegan en utf8, o la complicación para generar salida del HTML en utf8 (tener que poner utf8::encode() en cgiapp_postrun() me parece una chapuza, pero no encontré otra forma), o poner un listado en el código de los contenidos estáticos para exceptuarlos de los dinámicos (esto es, seguro, culpa mía).
En fin... es lo que pasa con los entornos de trabajo: hasta que no llegas a hacerte con los procedimientos y nomenclatura, vas dando palos de ciego, hasta que funciona (o crees que funciona).
use CGI::Application::Plugin::AutoRunmode;
use CGI::Application::Plugin::Session;
use CGI::Application::Plugin::Forward;
use CGI::Application::Plugin::Redirect;
use CGI::Application::Plugin::DBH (qw/dbh_config dbh/);
O, por ejemplo, el archivo index.cgi, que es el
wrapper de toda la aplicación, aunque uso algo tan cómodo como
use CGI::Application::Dispatch;
tengo que poner una línea de excepción como esta:
# mod_rewrite alters the PATH_INFO by turning it into a file system path, so we repair it.
# necesitamos esto para que las funciones url() nos den un resultado correcto
$ENV{PATH_INFO} =~ s/^$ENV{DOCUMENT_ROOT}// if defined $ENV{PATH_INFO};
O, también, por ejemplo, toda la confusión que rodea a CGI::Session (o CGI::Application::Plugin::Session), que nunca estás seguro de si has usado el procedimiento correcto para crear o leer la sesión.
Quiero decir que, si sigues la documentación de CGI::Session, y analizas con detalle lo que sucede, te das cuenta de que se crean dos registros de sesión, en lugar de uno solo.
Al final, resulta que todo se reduce a un "simple"
# configuración de la sesión de usuario
$self->session_config(
CGI_SESSION_OPTIONS => [ 'driver:File', $query, {Directory => "$DIRECTORIO_WEB/sesiones"} ],
DEFAULT_EXPIRY => '+90d',
COOKIE_PARAMS => { -expires => '+90d' },
SEND_COOKIE => 1,
);
$session = $self->session;
excepto... si la aplicación se ha llamado con la confirmación de registro de un usuario, que hay que poner una excepción porque, claramente, no existe objeto CGI::Session para un usuario que todavía no está registrado:
# Caso de que sea una confirmación,
# el usuario nos manda la id de sesión con la que se registró
if ($self->get_current_runmode() eq 'confirmacion') {
my $sid = $self->param('n');
if ($sid) {
# $self->query->param(-name => CGI::Session->name, -value => $sid, -override => 1);
$query->param(-name => CGI::Session->name, -value => $sid, -override => 1);
}
}
Es posible que Titanium abrevie todos estos procedimientos, pero, no lo conozco.