Back-End

21 nov, 2012

Usando o Catalyst Framework Perl – Parte 03

Publicidade

Como você já sabe, o Catalyst é um framework livre para o desenvolvimento de aplicações web escritas em Perl, que segue à risca o padrão MVC e suporta um grande número de padrões de desenvolvimento web experimentais. Ele é inspirado por outros frameworks web como Ruby on Rails e Maypole. É primariamente distribuído através do CPAN, que é o repositório oficial para distribuição de bibliotecas e aplicações escritas em Perl.

No artigos anteriores vimos como instalar e imprimir o “Seja Bem Vindo” e como usar a View Catalyst::View::TT, que nada mais é que o Template Toolkit.

Hoje veremos como usar os Actions, para definir a organização de sua aplicação e como capturar os argumentos.

Usando os Actions

Primeiro vamos criar o Controller Home, para isso digite no seu terminal:

cd MyApp
script/myapp_create.pl controller Home

Tirando os comentários que é gerado pelo helper, o Controller Home esta assim:

package MyApp::Controller::Home;
use Moose;
use namespace::autoclean;

BEGIN {extends 'Catalyst::Controller'; }

sub index : Path : Args(0) {
my ( $self, $c ) = @_;

$c->response->body('Matched MyApp::Controller::Home in Home.');
}

__PACKAGE__->meta->make_immutable;

1;

Com a crianção do Controller usando Helper, já gerou nosso primeiro exemplo de Action:

sub index : Path : Args(0) {}

Esse nosso primeiro Action, que é o index do nosso Controller e é um Action especial, o manual do Catalyst aconselha a não alterar esse action, leia mais em: https://metacpan.org/module/Catalyst::Manual::Intro#Built-in-special-actions

Agora vamos criar um Action com nome de foo, usando o tipo Local:

sub foo : Local {}

Esse tipo Local como o Path, usam o nome do Controller como namespace nas URLs, exemplos:

  • http://localhost:3000/home/foo
  • http://localhost:3000/home/foo/argumento1
  • http://localhost:3000/home/foo/argumento1/argumento2
  • http://localhost:3000/home/foo/*

Nesse Action podemos passar vários argumentos sem problema. Para você conseguir limitar esses argumentos, podemos usar Args, que não é um tipo de Action, mas é uma função que modifica a ação do Action, limitando a quantidade de argumentos. Exemplos:

Passar só um argumento

sub foo : Local : Args(1) {}

limita você só acessar na URL:

http://localhost:3000/home/foo/argumento1

Passar dois argumentos

sub foo : Local : Args(2) {}

limita você só acessar na URL:

http://localhost:3000/home/foo/argumento1/argumento2

Se você passar argumentos a mais ou menos na URL, o retorno vai ser erro 404, com a mensagem “Page not found”.

Com Path podemos definir nossa URL como quiser, podendo até passar caracteres e símbolos. Exemplos:

Primeiro exemplo

sub foo : Path('lucas-tiago') {}

Você poderá acessar a URL assim:

  • http://localhost:3000/home/lucas-tiago
  • http://localhost:3000/home/lucas-tiago/argumento1
  • http://localhost:3000/home/lucas-tiago/argumento1/argumento2
  • http://localhost:3000/home/lucas-tiago/*

Passar só um argumento

sub foo : Path('LUCAS') : Args(1) {}

limita você só acessar na URL:

http://localhost:3000/home/LUCAS/argumento1

Passar três argumentos

sub foo : Path('Brasil') : Args(3) {}

limita você só acessar na URL:

http://localhost:3000/home/Brasil/argumento1/argumento2/argumento3

Lembrado que se você passar argumentos a mais ou menos na URL, o retorno vai ser erro 404, com a mensagem “Page not found”.

Agora vamos falar do Global. Como próprio nome diz, esse tipo não usa nenhum namespace em na URL só o nome do Action, exemplos:

Primeiro exemplo:

sub europa : Global {}

Você poderá acessar a URL assim:

  • http://localhost:3000/europa
  • http://localhost:3000/europa/argumento1
  • http://localhost:3000/europa/argumento1/argumento2
  • http://localhost:3000/europa/*

Sobre Args, você pode usar igual aos exemplos com Local e Path.

Agora vamos ver sobre Regex e LocalRegex, os dois tipos trabalham com Expressões Regulares. A única diferença entre os dois é que Regex é global e LocalRegex é local. Exemplos:

Primeiro exemplo usando Regex:

sub foo : Regex('^[a-z]{5}#039;) {}

Você poderá acessar a URL assim:

  • http://localhost:3000/lucas
  • http://localhost:3000/teste
  • http://localhost:3000/barco

Com a regex ^[a-z]{5}$ você é limitado a acessar com caracteres de ‘a’ ate ‘z’ e com total de 5 caracteres. Se você passar dessa quantidade, ou utilizar menos ou outros, o retorno vai ser erro 404, com a mensagem “Page not found”.

Segundo exemplo usando Regex, eu peguei do próprio manual do Catalyst:

sub foo : Regex('^item(\d+)/order(\d+)#039;) {}

Você poderá acessar a URL assim:

  • http://localhost:3000/item34/order56
  • http://localhost:3000/item6/order2
  • http://localhost:3000/item100/order800

Com a regex ^item(\d+)/order(\d+)$ você é limitado a colocar ‘item’ seguido de caracteres numéricos e ‘order’ seguido de caracteres numéricos. Se você passar caracteres diferentes na URL, o retorno vai ser erro 404, com a mensagem “Page not found”.

Usando LocalRegex é a mesma lógica de Regex, o que muda é que você é obrigado a colocar o namespace do Controller no início, exemplo:

sub foo : LocalRegex('^item(\d+)/order(\d+)#039;) {}

Você poderá acessar a URL assim:

  • http://localhost:3000/home/item34/order56
  • http://localhost:3000/home/item6/order2
  • http://localhost:3000/home/item100/order800

Capturando os argumentos

Para capturar os argumentos do action usando Global, exemplos:

Primeiro exemplo com um argumento:

sub exemplo : Global {
my ( $self, $c, $argumento) = @_;

$c->res->body("$argumento");
}

Quando você acessar a URL assim:

http://localhost:3000/exemplo/lucas

Irá imprimir na tela: lucas

Segundo exemplo com dois argumentos:

sub exemplo : Global {
my ( $self, $c, $argumento1, $argumento2 ) = @_;

$c->res->body("$argumento1 $argumento2");
}

Quando você acessar a URL assim:

http://localhost:3000/exemplo/maria

Irá imprimir na tela: maria

Quando você acessar a URL assim:

http://localhost:3000/exemplo/maria/jesus

Irá imprimir na tela: maria jesus

Para capturar o action que esta sendo executado, você usa o método action. Exemplo:

sub site : Global {
my ( $self, $c ) = @_;

$c->res->body($c->action);
}

Quando você acessar a URL assim:

http://localhost:3000/site

Irá imprimir na tela: site

Para capturar os valores da regex usando Regex, exemplo:

sub foo : Regex('^item(\d+)/order(\d+)#039;) {
my ( $self, $c ) = @_;

my $valor1 = $c->req->captures->[0];
my $valor2 = $c->req->captures->[1];

$c->res->body("Valor 1: $valor1 <br /> Valor 2: $valor2");
}

Quando você acessar a URL assim:

http://localhost:3000/item879/order8999

Irá imprimir na tela:

Valor 1: 879
Valor 2: 8999

Finalizando

Espero que tenham gostado. Para saber mais sobre Catalyst: