Roteamento e Controladores

Nos vamos construir um inventário bastante simples para exibir nossa coleção de albuns. A página incial irá listar a coleção e permitir a inclusão, edição e exclusão de albuns. Para isso as seguintes páginas serão necessárias:

Página Descrição
Inicial Essa página irá exibir a lista de albuns e disponibilizar os links para edita-los e deleta-los. Também irá disponibilizar um link para a criação de novos albuns.
Inlcuir album Essa página ira conter um formulário para inclusão de album.
Editar album Essa página ira conter um formulário para edição de album.
Excluir album Essa página irá confirmar que nos queremos excluir um album e então realizar a exclusão.

Antes de configurar nossos arquivos, é importante entender como o framework espera que as páginas sejam organizadas. Cada página da aplicação é conhecida como uma action e ações são agrupadas em controllers dentro de modules. Dessa forma você irá geralmente agrupar ações em um controller, por exemplo, um controller de notícias deve ter as ações atual, arquivada e visualizar.

Como nos termos quatro páginas e todas elas são relativas aos albuns, nos iremos agrupá-las em um mesmo controller AlbumController dentro do nosso módulo Album como quatro ações. As quatro ações serão:

Página Controller Action
Inicial AlbumController index
Incluir album AlbumController add
Editar album AlbumController edit
Excluir album AlbumController delete

O mapeamento da URL para uma acão em particular é feito usando rotas que são definidas no arquivo module.config.php do módulo. Nos iremos adicionar uma rota para as ações dos albuns. Esse é o arquivo de configuração do módulo atualizado com o novo código em destaque.

<?php
return array(
    'controllers' => array(
        'invokables' => array(
            'Album\Controller\Album' => 'Album\Controller\AlbumController',
        ),
    ),

    // A seção a seguir é nova e deve ser adicionada ao arquivo
    'router' => array(
        'routes' => array(
            'album' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/album[/][:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Album\Controller\Album',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);

O nome da rota é ‘album’ e seu tipo é ‘segment’. Uma rota de Seguimento nos permite especificar variáveis na rota que serão mapeadas para parametros na rota correspondente. Nesse caso, a rota é ``/album[/:action][/:id]`` que irá corresponder a qualquer URL que comece com /album. O resto do seguimento será uma ação opcional e finalmente o último seguimento será mapeado para um id opcional. Os colchetes indicam que um seguimento é opcional. a seção constraints permite que nós certifiquemos que um seguimento é como esperado, por isso limitamos as ações a começar com uma letra e ter caracteres alfanuméricos, underscores ou hifens em seguida. Nos também limitamos o id à números.

Essa rota nos permite mapear as seguintes URLs:

URL Página Ação
/album Inicial (lista de albuns) index
/album/add Incluir novo album add
/album/edit/2 Editar album com id 2 edit
/album/delete/4 Excluir album com id 4 delete

Criando o Controlador

Nos agora estamos prontos para configurar nosso controller. No Zend Framework 2, o controller é uma classe que geralmente é chamada de {Controller name}Controller. Note que {Controller name} deve começar com uma letra maiúscula. Essa classe deve estar dentro de um arquivo chamado {Controller name}Controller.php no diretório Controller do seu módulo. No nosso caso isso é module/Album/src/Album/Controller. Cada ação é um método público dentro da classe controller nomeado como {action name}Action. Nesse caso {action name} deve começar com letra minúscula.

Nota

Isso acontece por convenção. O Zend Framework 2 não possui muitas restrições para os controller além do fato de eles terem que implementar a inteface Zend\Stdlib\Dispatchable. O framework disponibiliza duas classes abstratas que fazem isso para nos: Zend\Mvc\Controller\AbstractActionController e Zend\Mvc\Controller\AbstractRestfulController. Nos iremos usar o padrão AbstractActionController, mas se você pretende escrever uma aplicação RESTful, AbstractRestfulController pode ser útil.

Vamos seguir em frente e criar nossa classe controller AlbumController.php em zf2-tutorials/module/Album/src/Album/Controller:

<?php
namespace Album\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class AlbumController extends AbstractActionController
{
    public function indexAction()
    {
    }

    public function addAction()
    {
    }

    public function editAction()
    {
    }

    public function deleteAction()
    {
    }
}

Nota

Nos já informamos o modulo sobre nosso controller na seção ‘controller’ do arquivo module/Album/config/module.config.php.

Nos acavamos de configurara as quatro ações que nos queremos usar. Elas não funionam até que nos configuremos as views. As URLs para cada ação são:

URL Metodo chamado
http://zf2-tutorial.localhost/album Album\Controller\AlbumController::indexAction
http://zf2-tutorial.localhost/album/add Album\Controller\AlbumController::addAction
http://zf2-tutorial.localhost/album/edit Album\Controller\AlbumController::editAction
http://zf2-tutorial.localhost/album/delete Album\Controller\AlbumController::deleteAction

Nos agora temos um roteamoento funionando e as ações coniguradas para cada página da nossa aplicação.

É hora de contruirmos as camadas de View e Model.

Inicializando os arquivos de view

Para integrar as views na nossa aplicação tudo que precisamos fazer é criar alguns arquivos de views. Esses arquivos serão executados pelo DefaultViewStrategy que irá passar qualquer variável ou view models que forem retornados pelos métodos de ação do controller. Esses arquivos de views serão armazenados no diretório views do nosso módulo dentro de um subsiretório com o nome do controller. Crie agora esses quatro arquivos vazios:

  • module/Album/view/album/album/index.phtml
  • module/Album/view/album/album/add.phtml
  • module/Album/view/album/album/edit.phtml
  • module/Album/view/album/album/delete.phtml

Nos agora poderemos comerçar a preenche-los, começando com o banco de dados e os models.