Neste artigo iremos abordar o uso avançado de modelos no zend framework, que consiste em trabalhar com um conjunto de classes, Models, Mappers e DbTables. Essas classes quando utilizadas, dividem entre si as responsabilidades de um modelo, melhorando na organização e entendimento do mesmo.
Estrutura utilizada nos tópicos anteriores
Nos tópicos anteriores foi utilizado uma classe Zend_Db_Table como responsável pelos modelos, mas esse uso por mais que funcione não é o recomendado, confira a estrutura utilizada nos tópicos anteriores:
Estrutura para uso avançado de modelos
O uso recomendado da classe Zend_Db_Table(DbTable) consiste na representação de uma tabela do banco de dados, manipulação de registros, mapeamento de relacionamentos e etc, para adicionar nossa lógica de negócio é recomendado a utilização de classes Mapper além do Model para definição de atributos, confira a estrutura para o uso avançado de modelos:
Conhecendo as classes envolvidas
Model – Classe responsável pela definição dos atributos e métodos get e set de cada atributo.
Mappers – Classe intermediária, responsável por mapear a classe de acesso ao banco de dados(DbTable) e o modelo, é na classe mapper que definimos nossas regras de negócio.
DbTables – Classe responsável pelo acesso ao banco de dados, onde mapeamos os relacionamentos das tabelas, definimos qual a tabela responsável por determinado modelo, rowClass, rowsetClass e etc.
Você define como irá utilizar seus modelos
O zend framework em sua documentação de quickstart apresenta está estrutura para o uso de modelos, mas nada impede de você adotar a maneira que achar melhor para o seu projeto, não existe um padrão para utilizar modelos no zend framework, apenas recomendações.
Uso de rowClass e rowsetClass
Para utilizar uma classe Zend_Db_Table_Row e Zend_Db_Table_Rowset, apresentadas no tópico Customizando modelos no zend framework, basta escolher o local ideal para guardar as classes e configurar na classe Zend_Db_Table(DbTable) do modelo.
Projeto usando Model, Mapper e DbTable
Agora que vimos um pouco sobre as classes envolvidas no uso avançado de modelos, vamos criar um projeto para trabalhar, baseado na estrutura apresentada no tópico Preparando o ambiente para desenvolvimento com Zend Framework, crie um projeto com nome de example-advanced-models.
No exemplo que será visto agora, iremos utilizar o banco apresentado no artigo Entendendo modelos no zend framework, confira o script do banco abaixo:
Acesse o phpmyadmin, http://localhost/phpmyadmin, crie uma base de dados com o nome de “zf-models” e adicione o script acima para criar a tabela “user”. Caso você já tenha esse banco e tabela porque realizou o outro tópico também, apenas certifique-se de que a tabela está vazia.
Criando os arquivos do modelo
Para criar os arquivos do nosso modelo, iremos utilizar a estrutura apresentada no início do artigo, que consta com dois sub-diretórios na pasta “models” da nossa aplicação, DbTable e Mapper, confira novamente como deve ser nossa organização.
Agora vamos criar os arquivos do modelo, crie os arquivos das abas abaixo.
Nossa classe model User está seguindo os atributos da tabela “user” do banco de dados, mas como podemos perceber estamos personalizando um atributo, na tabela “user” temos o campo “user_id”, chave primária da tabela, na classe model para simplificar chamamos apenas de “id”. Poderiamos utilizar os métodos mágicos do php para personalizar os métodos get e set dos atributos, mas optei por deixar nosso exemplo o mais simples possível, passando apenas o conceito necessário para o uso avançado de modelos.
models/User.php
A classe mapper User possui como atributo interno uma instância da classe DbTable User, e na maioria de seus métodos recebe e/ou retorna um objeto da classe model User, também podemos visualizar um mapeamento usando array no método saveOrUpdate(), no qual dizemos que o atritubo “id” da classe Model user, corresponde ao campo “user_id” do banco de dados(DbTable). No método fetchAll montamos um array de resposta, personalizando o resultado em formato de Zend_Db_Table_Rowset da classe DbTable, nesse ponto vale lembrar que cada iteração corresponde a um objeto do tipo Zend_Db_Table_Row, em caso de customização dos modelos, apresentado no tópico Customizando modelos no zend framework, poderiamos montar facilmente determinado modelo usando os métodos criados na classe row customizada em casos de dependência e referência de outros modelos.
models/Mapper/User.php
Nossa classe DbTable é bem simples, nesse caso apenas definimos qual tabela corresponde ao modelo User.
models/DbTable/User.php
Trabalhando com nosso modelo
Com os arquivos do modelo criado, vamos explorar seus recursos, para isso vamos utilizar o IndexController.php e sua view, index.phtml.
IndexController.php
index.phtml
Estrutura final do nosso projeto:
Resultado
Ao executar nossa aplicação iremos obter o seguinte resultado:
Agora com o usuário “Diogo Matheus” já inserido no banco de dados, se você executar novamente nossa aplicação iremos obter uma mensagem dizendo que esse nome já está sendo utilizado.
Confira o código-fonte do exemplo no GitHub.