Nesse artigo vou mostrar o básico de como usar os Actions, para definir a organização de sua aplicação e como capturar os argumentos.
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 unica diferença entre os dois, é que Regex é global e LocalRegex é local. Exemplos:
Primeiro exemplo usando Regex:
sub foo : Regex('^[a-z]{5}$') {}
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 caracteres a mais, ou menos ou diferentes na URL, 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+)$') {}
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+)$') {}
Você poderá acessar a URL assim:
http://localhost:3000/home/item34/order56
http://localhost:3000/home/item6/order2
http://localhost:3000/home/item100/order800
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+)$') {
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
Espero que tenham gostado. Para saber mais sobre Catalyst:
https://metacpan.org/module/Catalyst::Manual
http://www.catalystframework.org
Lucas Tiago de Moraes (Lucas1)
lucastiagodemoraes@gmail.com
=head1 Catalyst Framework Perl (parte 3)