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: