Joel Gómez

Catalyst Web Framework – Primera Parte

by Joel Gómez on Mar.16, 2010, under Catalyst

¿Qué es un Framework?
Es un conjunto de herramientas que están integradas o hacen comunicación entre sí para la resolución de un trabajo en
particular.

¿Qué es MVC?
Es una metodología o estilo para construir aplicaciones que divide la implementación en “Modelo”, “Vista” y “Controlador”. El modelo es la representación de la información con el cual el sistema opera. La vista representa el modelo en un formato de salida para interactuar con el usuario (GUI). El controlador es la parte del sistema que responde a eventos del usuario e interactúa con el modelo con la información de entrada.

¿Qué es Catalyst Web Framework?
Es un Framework de código libre para aplicaciones web programado en Perl y hace uso de MVC. Catalyst no es un lenguaje de programación, es un Framework que integra un sin fin de módulos de Perl.

Instalando Catalyst Web Framework
Existen al menos dos maneras de instalarlo:
1.- Haciendo uso de los repositorios de su distribución:

# aptitude install libcatalyst-perl libcatalyst-engine-apache-perl
libcatalyst-model-cdbi-perl libcatalyst-modules-extra-perl
libcatalyst-modules-perl libcatalyst-view-tt-perl

Con el comando anterior estamos instalando tanto el Framework como algunos módulos extras para la conexión a bases de datos y generadores de vistas como Helpers

2.- Haciendo uso de CPAN

cpan -i Catalyst::Runtime Catalyst::Devel Task::Catalyst
Catalyst::Model::DBIC::Schema Catalyst::View::TT
DBD::SQLite DBIx::Class

Si es la primera vez que ejecutas CPAN entonces, éste le hará una serie de preguntas que no son del otro mundo y a las mayoría de las preguntas basta con darle <enter> :D

Comencemos entonces usar Catalyst :D

Lo primero que debemos hacer es ejecutar el siguiente comando para crear nuestro proyecto (por seguridad, no ejecute ningún comando de Catalyst como root ni tampoco edite los archivos como root):

# catalyst.pl evento

Tendremos como resultado lo siguiente:

created "evento"
created "evento/script"
created "evento/lib"
created "evento/root"
created "evento/root/static"
created "evento/root/static/images"
created "evento/t"
created "evento/lib/evento"
created "evento/lib/evento/Model"
created "evento/lib/evento/View"
created "evento/lib/evento/Controller"
created "evento/evento.conf"
created "evento/lib/evento.pm"
created "evento/lib/evento/Controller/Root.pm"
created "evento/README"
created "evento/Changes"
created "evento/t/01app.t"
created "evento/t/02pod.t"
created "evento/t/03podcoverage.t"
created "evento/root/static/images/catalyst_logo.png"
created "evento/root/static/images/btn_120x50_built.png"
created "evento/root/static/images/btn_120x50_built_shadow.png"
created "evento/root/static/images/btn_120x50_powered.png"
created "evento/root/static/images/btn_120x50_powered_shadow.png"
created "evento/root/static/images/btn_88x31_built.png"
created "evento/root/static/images/btn_88x31_built_shadow.png"
created "evento/root/static/images/btn_88x31_powered.png"
created "evento/root/static/images/btn_88x31_powered_shadow.png"
created "evento/root/favicon.ico"
created "evento/Makefile.PL"
created "evento/script/evento_cgi.pl"
created "evento/script/evento_fastcgi.pl"
created "evento/script/evento_server.pl"
created "evento/script/evento_test.pl"
created "evento/script/evento_create.pl"

Nos cambiamos a la carpeta que nos acaba de crear que es el mismo nombre del proyecto que se creó en el catalyst

# cd evento
# tree
.
|-- Changes
|-- Makefile.PL
|-- README
|-- evento.conf
|-- lib
|   |-- evento
|   |   |-- Controller
|   |   |   `-- Root.pm
|   |   |-- Model
|   |   `-- View
|   `-- evento.pm
|-- root
|   |-- favicon.ico
|   `-- static
|       `-- images
|           |-- btn_120x50_built.png
|           |-- btn_120x50_built_shadow.png
|           |-- btn_120x50_powered.png
|           |-- btn_120x50_powered_shadow.png
|           |-- btn_88x31_built.png
|           |-- btn_88x31_built_shadow.png
|           |-- btn_88x31_powered.png
|           |-- btn_88x31_powered_shadow.png
|           `-- catalyst_logo.png
|-- script
|   |-- evento_cgi.pl
|   |-- evento_create.pl
|   |-- evento_fastcgi.pl
|   |-- evento_server.pl
|   `-- evento_test.pl
`-- t
|-- 01app.t
|-- 02pod.t
`-- 03podcoverage.t

Con el comando “tree” nos muestra un árbol de directorios y archivos que están dentro de la carpeta evento (si no tienes el comando “tree” basta con instalarlo con: aptitude install tree)

En este momento ya podremos ver nuestro servidor de Catalyst ejecutando, hacemos el siguiente comando:

# script/evento_server -r

screenshot del servidor

En nuestro navegador colocamos la siguiente direccion: http://localhost:3000 y nos mostrará la página de bienvenida de Catalyst

La opción -r es para que cuando modifiquemos un archivo del Framework que requiera reiniciar el servidor no lo tengamos que hacer nosotros mismo sino que Catalyst lo reiniciará automáticamente.

Pasemos ahora a crear un Controlador:

# script/evento_create.pl Controller registro
exists "/home/joelgomez/evento/script/../lib/evento/Controller"
exists "/home/joelgomez/evento/script/../t"
created "/home/joelgomez/evento/script/../lib/evento/Controller/registro.pm"
created "/home/joelgomez/evento/script/../t/controller_registro.t"

Con nuestro servidor iniciado podremos colocar la siguiente dirección: http://localhost:3000/registro y nos mostrará una página web con:
Matched evento::Controller::registro in registro.

Esto, a parte de decirnos que vamos por buen camino, nos está diciendo lo que está programado en la controladora registro en el método index:

24 sub index : Path : Args(0) {
25     my ( $self, $c ) = @_;
26
27    $c->response->body(Matched evento::Controller::registro in registro.);
28 }

Nuestra controladora creada está ubicada en lib/evento/Controller y desde allí vamos a crear todos los método necesarios para nuestra aplicación.

Creación de vistas.
Para crear una vista es algo parecido a como hemos creado la controladora, vamos a usar TTSite como Helper, puesto que éste es mas flexible y usarlo es divertido, aunque tiene algunas limitaciones que más adelante iré detallando :D

# script/evento_create.pl View participante TTSite
exists "/home/joelgomez/evento/script/../lib/evento/View"
exists "/home/joelgomez/evento/script/../t"
created "/home/joelgomez/evento/script/../lib/evento/View/participante.pm"
created "/home/joelgomez/evento/script/../root/lib"
created "/home/joelgomez/evento/script/../root/src"
created "/home/joelgomez/evento/script/../root/lib/config"
created "/home/joelgomez/evento/script/../root/lib/config/main"
created "/home/joelgomez/evento/script/../root/lib/config/col"
created "/home/joelgomez/evento/script/../root/lib/config/url"
created "/home/joelgomez/evento/script/../root/lib/site"
created "/home/joelgomez/evento/script/../root/lib/site/wrapper"
created "/home/joelgomez/evento/script/../root/lib/site/layout"
created "/home/joelgomez/evento/script/../root/lib/site/html"
created "/home/joelgomez/evento/script/../root/lib/site/header"
created "/home/joelgomez/evento/script/../root/lib/site/footer"
created "/home/joelgomez/evento/script/../root/src/welcome.tt2"
created "/home/joelgomez/evento/script/../root/src/message.tt2"
created "/home/joelgomez/evento/script/../root/src/error.tt2"
created "/home/joelgomez/evento/script/../root/src/ttsite.css"

Debemos aclarar varias cositas hasta ahora: nuestros templates o vistas se almacenarán en root/src allí podremos crear las carpetas que nos sean necesarias para organizar mejor las vistas en caso de que la aplicación sea bastante grande. Vamos a crear un template llamado participante.tt2 y lo vamos a guardar en root/src/participante, por supuesto que la carpeta participante la tenemos que crear

# mkdir root/src/participante
# cd root/src/participante
# vim participante.tt2

Dentro de archivo participante.tt2 escribimos lo siguiente:

1 <p>Hola: [% nombre %] </p>

[% nombre %] Template Toolkit, esto nos ayudará bastante en el pase de variables desde la controlador hacia la vista, pueden echarle un vistazo desde su sitio oficial: http://template-toolkit.org/docs/index.html

Ahora, en nuestra controladora registro.pm ubicada en lib/evento/Controller escribimos el siguiente código debajo de la subrutina index:

30 sub saludo : Local {
31     my ( $self, $c) = @_;
32
33     $c->stash->{template} = participante/participante.tt2;
34     $c->stash->{nombre}   = Joel Gómez;
35 }

En nuestro navegador colocamos la siguiente dirección: http://localhost:3000/registro/saludo Nótese que la url se descompone como servidor/controlador/método.

En nuestra subrutina saludo lo que estamos haciendo es diciéndole a Catalyst cual es la vista que va a usar para ese método y paso una variable llamada nombre para la vista.

Hasta aquí el primer tutorial de Catalyst Web Framework, en la siguente entrega voy a modificar el Helper TTSite y empezaremos a programar las vistas.

Descargue el ejemplo Aquí

15 comments for this entry:
  1. AngelDeath

    Excelente Post! Muy buena explicación…

  2. Tunagui!

    Holaaaa!!. Que buen artículo!!!. Me ha encantado, espero ver de estos mas seguido!. ;)

  3. Jose Rey

    Excelente, pero si usas cpan, puedes mejor instalar: Task::Catalyst que se trae casi cualquier cosa que necesites de Catalyst comenzando, también puedes instalar Task::Catalyst::Tutorial que tiene todo lo necesario para el turorial.

  4. Joel Gómez

    Gracias por el comentario!!!
    Para los que me siguen, estos son módulos que se instalan desde el CPAN, ej: cpan -i Task::Catalyst Task::Catalyst::Tutorial

  5. Joel Gómez

    Gracias por su comentario!!!

  6. Joel Gómez

    Gracias por tu comentario :D
    Haré un post de Catalyst semanalmente..

  7. PerlFantasy

    Bueno y que pasa con la segunda parte,,,
    Oye te prongo que saquemos un pequeño blog de catalyst en español

  8. Joel Gómez

    La segunda parte sale mañana jueves o el viernes a primera hora.
    Lo del Blog de Catalyst en Español me parece genial la idea. Puede escribirme un correo para ir trabajando en eso
    joelgomezb@gmail.com

  9. Francisco

    Hola, nunca he usado esta herramienta… yo he trabajado con cgi::application para crear aplicaciones web. me gustaría que hicieran una comparación entre estas herramientas… por favor… bueno soy nuevo en el mundo de perl.

  10. Joel Gómez

    Saludos Francisco,
    Muchas gracias por ser el único en responder (hasta ahora me has hecho pensar que no estoy loco).

    CGI::Application es una Framework de programación web que solo usa módulos nativos de Perl a través de CGI (Common Gateway Interface) para llevarlo a un navegador, es decir, que no se cuenta con un servidor como tal para que la aplicación funcione.

    Antiguamente se usaba CGI para hacer que nuestras aplicaciones salieran por el puerto 80 debido a que los servidores web eran un poco lento e inestable y esta era la via de escape para nuestras aplicaciones.

    CGI::Application no es MVC

    En la actualidad, CGI es una tecnología obsoleta tanto por los servidores web como para los lenguajes de programación debido a que la punta de lanza de la programación web es MVC (Modelo Vista Controlado).

    Ejemplo, anteriormente para hacer sistemas web se tenia que usar Visual Basic, .NET, Perl, C++, y muchos mas y, si te fijas bien todos son lenguajes de programación que obligatoriamente se necesitaba de un interpretador para convertilo en HTML y CGI era parte de esa solución.

    Por qué Catalyst?
    Catalyst es un Framework de programación web MVC basado en Perl, que cuenta con un servidor que el mismo levanta usando el módulo Catalyst::Engine::HTTP que es muchísimo mas rápido que CGI.

    Catalyst posee una buena cantidad de plugin’s que te pueden resolver la vida :D por supuesto que además cuentas con los módulos disponibles en el CPAN para hacer usada en cualquier aplicación Catalyst.

    Catalyst, debbuging no es un dolor de cabeza :D

    Te invito a que hagas las prácticas de los dos post que he publicado y cualquier duda estamos a la orden por estos lados.

    No dudes en preguntar que con gusto te respoderé.
    Recuerda que soy CARUPANERO jejejejeje

  11. edi

    hola no puedo instalar libcatalyst-engine-apache-perl y tampoco puedo ejecutar el comando script/evento_server -r… me dice que no existe el fichero. Me podrias ayudar.

  12. Joel Gómez

    Saludos, Estas usando Debian o Ubuntu? Cual versión de los mismos? dame un poquito mas de pista para ayudarte. De todas maneras prueba esto: cpan -i Task::Catalyst

  13. Joel Gómez

    Edi, me falto algo: si tienes problemas con el comando script/evento_server -r debes verificar que lo estas ejecutando dentro de la carpeta “evento” del proyecto, también puedes ubicarte dentro de la carpeta “evento/script” y desde allí ejecutas ./evento_server -r

  14. edi

    Hola gracias por responder. si lo estaba ejecutando desde el proyecto evento. probe el otro comando y me sigue diciendo que no existe el fichero o el directorio. estoy utilizando ubuntu 9.10

  15. Darwin Padrino

    Saludos estimado excelente post, pero el mismo presenta unos detallitos:
    al ejecutar : # script/evento_server -r falta la (.pl), es decir:
    # script/evento_server.pl -r

    y al escribir el fragmento de código:
    30 sub saludo : Local {
    31 my ( $self, $c) = @_;
    32
    33 $c->stash->{template} = “participante/participante.tt2“;
    34 $c->stash->{nombre} = “Joel Gómez“;
    35 }
    el mismo genera un error de compilación, lo cual corregí al cambiar las comillas dobles por comillas simples en: Ubuntu 9.10 – Karmic Koala – publicada en Octubre de 2009.

    A título didáctico es perfecto, porque te obliga a indagar y resolver esos detalles.
    Excelente-Gracias

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...

Archives

All entries, chronologically...