Skip to content

Instantly share code, notes, and snippets.

@lucas1
Created February 22, 2012 02:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucas1/09888d7f83f8db79be62 to your computer and use it in GitHub Desktop.
Save lucas1/09888d7f83f8db79be62 to your computer and use it in GitHub Desktop.
Catalyst Framework Perl (parte 3)

Catalyst Framework Perl (parte 3)

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.

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 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

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+)$') {
   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

Finalizar

Espero que tenham gostado. Para saber mais sobre Catalyst:

https://metacpan.org/module/Catalyst::Manual

http://www.catalystframework.org

http://sao-paulo.pm.org

http://www.perl.org

Autor

Lucas Tiago de Moraes (Lucas1)

E-mail

lucastiagodemoraes@gmail.com

@lucas1
Copy link
Author

lucas1 commented Feb 22, 2012

=head1 Catalyst Framework Perl (parte 3)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment