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.
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.
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.
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.
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
{
}
?>
|
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.
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
Preencha e envie o formulário. Você deverá ver uma mensagem de êxito.
Figura 5. 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
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.
|