[Cascavel-pm] Catalyst: Dispatching

Nilson Santos Figueiredo Jr. acid06 em gmail.com
Quinta Maio 20 18:09:29 PDT 2010


2010/5/20 Ednardo Lobo <ednardo em lobo.eti.br>:
> 1) Class::DBI

Primeira importante dica: troque o Class::DBI por DBIx::Class. É uma
solução bem mais moderna, robusta e bem suportada pela comunidade.

> Minha maior dificuldade no momento é com relação ao mapeamento de URLs em
> "actions" (dispatching), cuja a metodologia ainda não compreendi bem. Em
> razão disso não sei ao certo qual a melhor forma de estruturar os
> "Controllers" e as "actions" dentro deles.

Esse conhecimento vem com o tempo.
Você já leu as manpages adequadas, pelo que disse. Então o que falta
mesmo é colocar a mão na massa.

Uma maneira fácil e que funciona bem (ao menos inicialmente) é tentar
criar controllers para cada uma das entidades sobre as quais ocorrerão
ações em seu sistema.
Vamos supor que seu sistema tenha "Clientes" e "Pedidos de Compra".
Então você teria um controller para cada um dos dois. Esses
controllers, por sua vez, teriam ações como "create", "view",
"update", "delete" (e ações adicionais que se mostrem necessárias).

Como você já leu sobre o Chained, vou colocar abaixo um padrão que eu
costumo usar, que acho bom. Basicamente, em cada um dos controllers,
existirá uma ação "base" que serve como "âncora" para o controller,
alé disso existirá uma ação "load" que carrega aquela entidade e as
outras ações que precisam dela carregada serão encadeadas nesse ponto.
De antemão já peço pra desculpar qualquer erro de sintaxe, pois estou
escrevendo diretamente no email.

  package MyApp::Controller::PurchaseOrder;

  sub base : Chained ('.') CaptureArgs( 0 ) {
      # lógica que vai ser executada para cada ação nesse controller
  }

  sub load : Chained ('base') CaptureArgs(1) {
      my ($self, $c, $id) = @_;
      # carrega o elemento do banco de dados
      $c->stash->{purchase_order} =
$c->model('Schema::PurchaseOrder')->find( $id );
  }

  sub view : Chained('load') Args(0) PathPart('') {
      # aqui o $c->stash->{purchase_order} já estará disponível
  }

  sub delete : Chained('load') Args(0) PathPart('delete') {
      my ($self, $c) = @_;
      $c->stash->{purchase_order}->delete;
  }

  sub create : Chained('base') Args(0) PathPart('create') {
      # essa é encadeada no 'base' então o purchase_order não está disponível
  }

E aí, no seu controlador Root, coloca algo assim, para cada um dos
controladores usando esse esquema:

  package MyApp::Controller::Root;

  sub purchaseorder : Chained('/') PathPart('purchaseorder') {}

Dessa maneira, no final das contas você vai ter as seguintes URLs:

  /purchaseorder/123 -> view item 123
  /purchaseorder/123/delete -> delete item 123
  /purchaseorder/create -> create

Existem módulos na CPAN que meio que automatizam essa tarefa de crirar
aplicações em estruturas similares, mas como você está aprendendo,
experimentar com o que eu postei acima pode ajudar.

-Nilson


Mais detalhes sobre a lista de discussão Cascavel-pm