PHP – Melhores práticas parte 1: MVC

Posted on janeiro 20, 2010. Filed under: PHP |

Nessa nova série de artigos vamos abordar assuntos referentes a melhorar a qualidade de nossos códigos. Alguns exemplos do que vem pela frente: MVC, Unit Testing, Coding Standard, Segurança, entre outros. Espero que aproveitem.

Arquitetura MVC

Vamos abordar os principais conceitos relacionados ao MVC. O artigo é mais teórico do que prático. A intenção é concientizar sobre a melhor maneira de utilizar o MVC. Não há necessidade de implementar um MVC do zero. Utilize um dos diversos frameworks MVC existentes para PHP. Use os conceitos abordados aqui no seu framework de preferência. Durante este artigo vamos citar classes do Zend Framework para exemplificar alguns pontos.

O objetivo do MVC é separar o Modelo (Model) da apresentação (View) com a ajuda de um Controller. View é aquilo que o usuário enxerga: formulário web, lista de produtos, etc. Geralmente formados por códigos HTML/CSS e Javascript. O Controller recebe a requisição do usuário e decide qual modelo chamar, obtem as informações necessárias e então atualiza o View. Um ponto importante aqui é que o Modelo não deve depender da View. A View pode mudar sem ter que precisar de alterar o Modelo.
O Modelo não se refere somente acesso ao banco de dados. Ele pode conter chamadas para webservices, acessar arquivos em disco, etc. Ele compôe também as regras de negócio da aplicação.

O Controller

Nos principais framewors atuais temos um “Front Controller” que recebe os parâmetros da requisição e despacha para uma classe que irá fazer o devido processamento.Estas classes, que fazem o processamento do input, são conhecidas como “Controllers”, são as Action Classes.
Perceba a diferença que existe entre “Front Controller” e “Controller”. O Front Controller recebe a requisição e dispara para uma action, um Controller, que irá tratar o input. O Front Controller determina qual action chamar de acordo com a “Query String” da requisição. Por exemplo: A requisição para o página http://localhost/admin/new será recebida pelo Front Controller e irá despachar para o método “newAction” do Controller “Admin”.

Precisamos tomar cuidado para não colocar regras de negócio no controller. Este não é o seu propósito. Regras de negócio no controller não poderão ser reutilizados fora dele. Além disso, poderemos ter código duplicados. Lembre-se destes pontos e caso haja necessidade faça o refactoring do código.

View

Após o processamento dos dados enviados pela requisição, nós precisamos apresantá-los para o usuário. É aqui que entra o nosso View, ou camada de apresentação. Exemplo: Formulários, textos, listas, css, javascript, etc. Todos pertencem a camada View.

Ao trabalhar com templates na camada view temos que lidar com diversas maneiras de apresentar os dados. Por exemplo, fazer um loop para exibir items de uma coleção. Exibir um texto de acordo com a permissão do usuário ou se o usuário esta logado ou não. Exibir um estilo css diferente de acordo com determinada situação. Ou seja, existem situações que devemos escrever diferentes tipos de lógicas em nossa camada de apresentação.

Porém a regra da camada de apresentação é fornecer uma maneira simples e fácil para a interação com um Webdesigner. Conforme formos adicionado estas lógicas na camada de apresentação, vamos perdendo este foco, deixando nosso template difícil de manter. A regra é que devemos utilizar o mínimo de código possível em nossos templates. Uma maneira de resolver esse problema é mover a lógica dos templates para classes Helpers. Além de manter o template em uma linguagem mais simples, podemos reutilizar o código que estão nos Helpers.

O Zend Framework permite a criação de Helpers de maneira fácil. Além de criar seus próprios Helpers, é possível utilizar diversos Helpers já prontos, distribuídos junto com o framework. Exemplo: Helpers para criação de formulários (form, formButton, formCheckBox, fidlset, formHidden, formFile, formRadio, formPassword, formRadio, formSelect,formText, etc.). Disparar ações para controllers. Doctype. HeadTitle, etc.

Em sua utilização do MVC você deve permitir que a camada de apresentação tenha diversas representações sem que haja necessidade de mudar o Modelo para que isto seja possível. Você pode querer representar a camada View em XML e em HTML ou em outro formato. Caso você precise alterar o Modelo para que se possível manter diversas representações da View, então você deve rever seu código e fazer o devido refactoring.

Model

Muitos programadores tem em mente que o Modelo é o lugar onde deve-se colocar código que irá interagir com o banco de dados. Sim, isto é verdade. Você pode colocar código para interagir com banco de dados no modelo. Porém não é somente isso. Você pode colocar código para trabalhar com webservice, acessar o sistema de arquivos e, o mais importante, colocar as regras de negócio da sua aplicação. O Modelo deve conter o código reutilizável de seu aplicativo. Usando o Modelo corretamente facilita o uso de testes unitários. Você pode testar de forma isolada as regras contidos no Modelo.

Exemplos

Segue abaixo exemplo de algumas situações e em qual camada devem ser tratadas:

Sua aplicação permite que o usuário faça upload de imagens. Toda vez que o usuário fizer o upload de uma imagem,nós inserimos um registro no banco de dados, armazenamos a imagem no sistema de arquivos e enviamos um e-mail para o usuário notificando que o upload ocorreu com sucesso.

Em qual camada deve estar ?

Com certeza na camada de Modelo. Imagine se esta lógica estivesse no Controller ?

  • A query estaria no controller!
  • A lógica utilizada no upload de imagem não poderia ser usada fora do Controller.
  • O código não poderia ser testado sem ter que chamar a aplicação inteira.

Muitas desvantagens, certo ?

Outra situalção:

Filtrando e validando o Input do usuário ?

Você deve responder logo de cara: Controller. Isto esta correto ? Sim, em partes. O filtro e a validação podem ser realizadas no controller, porém a lógica utilizado no filtro ou na validação devem estar em uma classe separada. O objetivo é que a lógica de validação e filtro possam ser reutilizáveis. Por exemplo: validação de cpf, telefone, email, data, etc..
O Zend Framework possui classes para tratar validação e filtros: Zend_Filter e Zend_Validate. Diversos filtros e validações já estão prontos para uso. Porém como qualquer framework flexível, ele permite a criação de seus próprios filtros e validações.

Make a Comment

Deixe uma resposta para Trambulhao Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

2 Respostas to “PHP – Melhores práticas parte 1: MVC”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

Porque todos os artigos sobre MVC para PHP nunca é finalizado?

É pena ter estagnado na primeira parte. Prometia uma continuação de excelentes artigos.

Parabéns Douglas

Obrigado pelo Alerta.. Estou com outras prioridades no momento mas pretendo dar continuidade no artigos. Abraços!


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: