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 está 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 este Action.
Leia mais em:
Agora vamos criar um Action com nome de "foo", usando o tipo Local:
sub foo : Local {}
Esse tipo Local como o Path, usa 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 problemas. Para você conseguir limitar estes 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 o próprio nome diz, este tipo não usa nenhum namespace 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}$') {}
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