Avançar para a área de conteúdo

ir para o conteúdo principal

developerWorks Brasil  >  Software livre  >

Prepare Web Sites com Rapidez Utilizando CakePHP, Parte 1: Introdução

Auxílio no Desenvolvimento Rápido e Fácil de PHP

developerWorks
Ir para a página anteriorPágina 3 de 11 Ir para a próxima página

Opções de documento

Código de amostra


Classificar este tutorial

Ajude-nos a melhorar este conteúdo


Design do MVC

Neste ponto, é bastante comum se envolver e começar a produzir código com base naquilo que o aplicativo deve fazer. Uma página de login, um banco de dados e um registro — Pronto! Simples assim. E geralmente é. Até você querer mudar a forma como ele interage com o banco de dados, alterar regras de validação ou não alterar essencialmente nada no aplicativo. Então as coisas começam a se complicar.

O CakePHP foi projetado para deixar a gravação de um aplicativo o mais fácil possível, enquanto oferece a você algo que possa ser mantido a longo prazo. O tutorial mostrará como construir o Tor utilizando o padrão de design do MVC. O CakePHP mostrará como isso pode ser fácil. Você vai ver porque isso faz sentido.

O padrão de design do MVC divide um aplicativo em três camadas distintas: Gerenciamento de dados, UI e Lógica, respectivamente. O MVC foi descrito primeiro no livro Padrões de Design: Elementos de Software Orientado a Objetos Reutilizáveis , também conhecido como o livro "Gang Of Four". Uma discussão completa sobre padrões de design e MVC está fora do escopo deste tutorial, mas será útil saber o que essas três partes significam — especificamente, no mundo do CakePHP.

Modelo

Usuários, produtos, preços, mensagens — quando você resume isso tudo, eles são apenas dados. Você se certifica de que esses são os dados que você quer, eles entram em um banco de dados e você tem que resgatá-los novamente. Será muito útil que todos os aspectos de manipulação de dados do Tor fiquem em um único lugar. É aí que entra o modelo.

A principal preocupação do modelo é a manipulação de dados. Obter dados de um banco de dados, inserir dados em um banco de dados, validar dados — tudo isso acontece dentro de um modelo.

Um modelo individual normalmente é utilizado para acessar uma tabela específica no banco de dados. Geralmente, um modelo é associado a uma tabela de banco de dados se o nome da tabela for uma forma no plural do nome do modelo. Por exemplo, um modelo Produto será, por padrão, associado a uma tabela Produtos.

Todos os modelos definidos pelo usuário estenderão a classe AppModel do CakePHP.



Voltar para parte superior


O Modelo de Usuário

Após criar uma tabela de usuários para o Tor, você vai precisar utilizar um modelo de usuário para interagir com a tabela. O modelo de usuário salvará seus dados de usuário, os resgatará da tabela para você e verificará se os dados do usuário estão em um formato aceitável. Por enquanto, este modelo pode ser um stub. Ele deve ser criado como app/models/user.php e pode ser semelhante à Listagem 8.


Listagem 8. O Modelo de Usuário
                 
<?php
class User extends AppModel
{
        var $name = 'User';
}
?>
                

Observe a linha var $name = 'User';. Ela é aceita como melhor prática para especificar o nome do modelo em $name.



Voltar para parte superior


Visualização

Poder salvar, recuperar e validar seus dados são coisas totalmente inúteis sem alguns meios de exibição de dados. Ao colocar todo o código de exibição e apresentação em um lugar, você pode alterar a aparência e o comportamento do seu aplicativo sem precisar de uma solução alternativa para a lógica de aplicativo e o código relacionado aos dados.

A visualização preocupa-se principalmente com a formatação de dados para apresentação para o usuário. A visualização representa todo e qualquer trabalho da UI, incluindo todos os modelos e HTML. Os arquivos de visualização do CakePHP são arquivos HTML regulares integrados ao código de PHP.

Por fim, uma visualização é apenas um modelo de página. Geralmente a visualização é nomeada depois de uma ação associada a ela. Por exemplo, uma ação display() normalmente teria uma visualização de exibição.

Retornando ao aplicativo de amostra, criamos uma tabela de usuários e um modelo de usuário para interagir com essa tabela. Agora precisamos de algumas visualizações. O usuário vai precisar registrar uma conta e efetuar login no aplicativo. Isso demanda uma visualização de registro e login.



Voltar para parte superior


A Visualização de Registro

Antes de um usuário poder utilizar o aplicativo Tor, ele vai precisar registrar uma conta. Isso vai exigir uma visualização de registro, que apresentará o formulário de registro ao usuário. Você já deve saber que tipo de informações sobre o usuário o Tor está procurando — especificamente, você vai precisar coletar um nome de usuário, uma senha, um endereço de e-mail e o primeiro e último nomes.

A visualização de registro deve ser criada como app/views/users/register.ctp e pode ser semelhante à Listagem 9.


Listagem 9. A Visualização de Registro
                    
<form action="/users/register" method="post">
<p>Please fill out the form below to register an account.</p>
<label>Username:</label><input name="username" size="40" />

<label>Password:</label><input type="password" name="password" size="40"
/>

<label>Email Address:</label><input name="email" size="40"
maxlength="255" />

<label>First Name:</label><input name="first_name" size="40" />

<label>Last Name:</label><input name="last_name" size="40" />

<input type="submit" value="register" />
</form>
                

É importante notar que os nomes de campo são os mesmos que os nomes de coluna em seu banco de dados. Isso se tornará um fator importante quando chegarmos ao controlador de usuários. Mais tarde, quando aprender um pouco mais sobre o Cake e vir como o Cake Helpers funciona, você vai regravar esta página completamente, mas, por enquanto, esta página é uma HTML regular, como provavelmente você sempre gravou.



Voltar para parte superior


Controlador

Com a manipulação de dados toda contida no modelo, e a camada de apresentação toda contida na visualização, o restante do aplicativo viverá no controlador. É aí que o aplicativo 'faz' coisas — lógica, tomada de decisões, fluxo de trabalho, etc. O modelo gerencia seus dados, a visualização os mostra para você e o controlador faz todo o resto.

O controlador gerencia pedidos do servidor. Ele aceita entrada do usuário (pedidos de URL, forma POSTs, pedidos GET, etc.), aplica lógica onde necessário, invoca modelos onde a manipulação de dados é necessária e envia saída através da visualização apropriada.

Geralmente um controlador gerencia lógica para um único modelo. Um controlador contém qualquer número de funções, referidas como ações. Uma ação normalmente aplica lógica e exibe uma visualização. Todos os controladores definidos pelo usuário precisarão estender a classe AppController do CakePHP.

No Tor, você criou uma tabela de usuários, um modelo de usuário para interagir com a tabela e visualizações para apresentar formulários de registro e login para o usuário. Esses formulários serão enviados aos controladores de usuários, invocando as ações register e login, respectivamente. Os controladores de usuários devem ser criados como app/controllers/users_controller.php e começar com um aspecto semelhante à Listagem 10.


Listagem 10. O Controlador de Usuários
                 
<?php
class UsersController extends AppController
{
}
?>
                



Voltar para parte superior


A Ação register

Agora você tem um controlador. Mas por enquanto ele não está fazendo nada. Antes que ele faça qualquer coisa por você, você terá que dar a ele algumas ações para executar. Agora você está registrando os aspectos práticos. O usuário preencheu um formulário e o enviou ao aplicativo. Cobriremos a validação de dados mais tarde, mas por enquanto, apenas colocaremos os dados de registro no banco de dados. Isso é feito incluindo a ação register no controlador de usuários.


Listagem 11. A Ação register
                    
<?php
class UsersController extends AppController
{
  function register()
  {
    if (!empty($this->params['form']))
    {
      if ($this->User->save($this->params['form']))
      {
        $this->flash('Your registration information was accepted.',
'/users/register');
      } else {
        $this->flash('There was a problem with your registration',
'/users/register');
      }
    }
  }
}
?>

A ação register começa examinando o formulário ($this->params['form']) para saber se ele foi enviado. Se o formulário não foi enviado, a ação não executará nada. Quando você souber que o formulário foi enviado com dados, o controlador chamará o método save no modelo de usuário, que é uma extensão de AppModel. O método save irá, por padrão, procurar uma tabela que seja o plural do próprio modelo. Nesse caso, ele está procurando uma tabela de usuários para acompanhar o modelo de usuário. Se a tabela for localizada, o método save transformará a array passada ($this->params['form']) em uma instrução INSERT utilizando as chaves de array como nomes de colunas e os valores de array como os valores INSERT.

Quando você souber que o formulário foi enviado com dados, o controlador chamará o método save no modelo de usuário, que é uma extensão de AppModel. O método save irá, por padrão, procurar uma tabela que seja o plural do próprio modelo. Nesse caso, ele está procurando uma tabela de usuários para acompanhar o modelo de usuário. Se a tabela for localizada, o método save transformará a array passada ($this->params['form']) em uma instrução INSERT utilizando as chaves de array como nomes de colunas e os valores de array como os valores INSERT. Nesse caso, $this->params['form'] será semelhante à Listagem 12.


Listagem 12. A Ação $this->params['form']
                    
Array
(
    [username] => zaphod
    [password] => secret
    [email] => beeblebrox@heartofgold.hhg
    [first_name] => zaphod
    [last_name] => beeblebrox
)
                

O método save construirá uma instrução INSERT a partir do restante. Ela será semelhante à Listagem 13.


Listagem 13. INSERT statement
                 
INSERT INTO 
 users 
(username, password, email, first_name, last_name) 
VALUES
('zaphod', 'secret', 'beeblebrox@heartofgold.hhg', 'zaphod', 'beeblebrox')
                

Agora deve estar evidente porque você utilizou os nomes de colunas de banco de dados na visualização de registro para os nomes de campos de formulário de registro. Fazendo isso, você simplificou o processo de salvamento de seus dados de forma significativa.

Para continuar, se os dados forem inseridos com sucesso, a ação register chamará o método Flash. O Flash apresenta uma mensagem básica para o usuário (nesse caso, uma mensagem de êxito ou falha) com um link a partir da mensagem (nesse caso, de volta para a visualização de registro, desde que nada mais tenha sido definido).

Agora que você tem um modelo de usuário para criar uma interface com sua tabela de usuários, uma visualização de registro para mostrar um formulário de registro e um controlador de usuários com uma ação register, é possível ver de fato seu aplicativo em ação.



Voltar para parte superior


Experimente

Todas as partes se encaixaram no devido lugar. É hora de trazer Tor para a vida. Inicie seu navegador e comece.

Carregue a visualização de registro acessando http://localhost/users/register. Você deverá ver algo semelhante à Figura 4.


Figura 4. Carregando a Visualização de Registro
Carregando a Visualização de Registro

Preencha e envie o formulário. Você deverá ver uma mensagem de êxito.


Figura 5. Mensagem de Sucesso
Mensagem de Sucesso

Se olhar seu banco de dados, você verá um registro correspondente ao envio do seu formulário, preenchido com uma senha de texto simples (uma ideia terrível que será consertada posteriormente).

Tente preencher o formulário novamente utilizando as mesmas informações. Você deverá ver uma mensagem de falha.


Figura 6. Falha de Registro
Falha de Registro

Se estiver utilizando um banco de dados que suporte a restrição de campo UNIQUE, o registro falhará. Durante a criação da tabela de usuários, os campos de nome de usuário e e-mail foram definidos como UNIQUE, o que significa que valores para esses campos não podem ser duplicados. O CakePHP reconhece o erro quando o banco de dados o emite e exibe um erro.



Voltar para parte superior



Ir para a página anteriorPágina 3 de 11 Ir para a próxima página