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

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

CakePHP é um auxílio estável de desenvolvimento rápido e pronto de produção para a construção de Web sites em PHP. Esta série "Prepare Web Sites com Rapidez Utilizando CakePHP" mostra como construir um catálogo de produtos on-line utilizando CakePHP.

Duane O'Brien, PHP developer, Freelance

Duane O'Brien é um canivete suíço tecnológico desde quando The Oregon Trail era somente texto. Sua comida favorita é sushi. Ele nunca esteve na lua.



26/Mai/2014

Antes de Começar

Nota do editor: Esta série foi publicada originalmente em 2006 e atualizada em 2007 e 2008. Desde sua última publicação, os desenvolvedores do CakePHP fizeram mudanças no CakePHP, resultando em várias revisões desta série. Essa revisão foi escrita para o CakePHP V1.2.2.8120.

Esta série "Prepare Web Sites com Rapidez Utilizando CakePHP" foi projetada para desenvolvedores de aplicativos PHP que querem começar a utilizar o CakePHP para facilitar suas vidas. No final, você terá aprendido como instalar e configurar o CakePHP, os princípios básicos do design Model-View-Controller (MVC), como validar dados do usuário no CakePHP, como utilizar auxiliares do CakePHP e como ter um aplicativo ativo e em execução rapidamente utilizando o CakePHP. Isso pode parecer muita coisa para se aprender, mas não se preocupe — o CakePHP faz grande parte disso por você.

Sobre esta Série

  • A Parte 1 se concentra em deixar o CakePHP ativo e em execução e nos princípios básicos de como construir um aplicativo simples que permita que os usuários se registrem para uma conta e efetuem login no aplicativo.
  • A Parte 2 demonstra como utilizar armação e Bake para dar o pontapé inicial em seu aplicativo e como utilizar as listas de controle de acesso (ACLs) do CakePHP.
  • A Parte 3 mostra como utilizar Sanitize, uma classe acessível do CakePHP, que ajuda a proteger um aplicativo limpando dados enviados pelo usuário. A Parte 3 também cobre o componente CakePHP Security, manipulando pedidos inválidos e outras autenticações de pedidos avançados.
  • A Parte 4 se concentra principalmente no componente Session do CakePHP, demonstrando três maneiras de se salvar dados da sessão, bem como o componente Request Handler, para ajudar você a gerenciar vários tipos de pedidos (navegadores remotos, pedidos contendo XML ou HTML, etc).
  • E a Parte 5 trata de armazenamento em cache, especificamente armazenamento em cache de visualização e layout, que pode ajudar a reduzir o consumo de recurso do servidor e acelerar sua aplicação.

Sobre Este Tutorial

Este tutorial mostra uma introdução ao uso do CakePHP. Você passará pelo processo de instalação, depois entrará de cabeça na gravação do código de registro do usuário. Através disso tudo, você verá quanto tempo poderia ter economizado se tivesse optado por utilizar CakePHP. Esta parte do tutorial constrói o aplicativo do produto on-line, Tor, que inclui uma página "solicitar nome de usuário e senha do revendedor" e uma página de login.

Os tópicos do CakePHP incluem:

  • Design do MVC
  • Helpers
  • Validação de dados do CakePHP

Pré-requisitos

Eu suponho que você já esteja familiarizado com PHP, tenha uma compreensão fundamental de design de banco de dados e se sinta confortável ao por a mão na massa. Não é necessário ter uma compreensão total do padrão de design do MVC, já que os fundamentos não serão cobertos neste tutorial. Acima de tudo, você deve estar ávido por aprender, pronto para entrar de cabeça e ansioso para acelerar seu tempo de desenvolvimento.

Requisitos do Sistema

Antes de começar, você precisa ter um ambiente no qual possa trabalhar. O CakePHP possui requisitos de servidor mínimos razoáveis:

  1. Um servidor HTTP que suporte sessões (e, preferencialmente, mod_rewrite). Este tutorial foi gravado utilizando Apache V2.2.4 com mod_rewrite ativado.
  2. PHP V4.3.2 ou posterior (incluindo PHP V5). Este tutorial foi gravado utilizando PHP V2.3
  3. Um mecanismo de banco de dados suportado. Este tutorial foi gravado utilizando MySQL V5.0.4

Você também vai precisar de um banco de dados pronto para utilizar no seu aplicativo. O tutorial vai fornecer sintaxe para a criação de quaisquer tabelas necessárias em MySQL.

A maneira mais simples de fazer o download do CakePHP é visitando CakeForge.org e fazendo o download da versão estável mais recente. Este tutorial foi gravado utilizando as compilações noturnas V1.2.2.8120, e as cópias diretamente do Subversion também estão disponíveis. Os detalhes estão no Manual do CakePHP (consulte Recursos).


Instalação

O CakePHP quer facilitar sua vida, independentemente do seu nível de experiência, deixando seus aplicativos mais fáceis de manter e mais rápidos de gravar. O CakePHP é cheio de recursos legais e úteis. O CakePHP quer tratar do seu Ajax, de sua validação de dados e de suas sessões. Ele pode até fatiar um pão para você se você puder gravar um plug-in ensinando-o como fazer isso. Mas você ainda não pode utilizar o CakePHP. É preciso instalá-lo primeiro.

Descompactar e Instalar

Para o propósito deste tutorial, o diretório de instalação inteiro do CakePHP deve ser descompactado no webroot do servidor da Web. Na Listagem 1, o webroot é /webroot.

Listagem 1. Descompactando o Diretório de Instalação do CakePHP
unzip cake_1.2.2.8120.zip
cd cake_1.2.2.8120
mv * /webroot

Digite ls -la /webroot para listar o conteúdo do webroot e verificar se os arquivos foram movidos corretamente. A saída deve ser semelhante à Listagem 2.

Listagem 2. Saída do Comando ls
-rw-r--r--    1 YOURUSER  YOURGROUP       139 2007-12-15 22:50 htaccess
drwxr-xr-x   12 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 app
drwxr-xr-x    7 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 cake
-rw-r--r--    1 YOURUSER  YOURGROUP      2303 2007-12-15 22:50 index.php
drwxr-xr-x    5 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 vendors

O diretório app/tmp precisa ser gravável pelo seu servidor da Web. Confirme as permissões nesta pasta digitando ls -l app. A saída provavelmente se assemelhará à Listagem 3.

Listagem 3. Confirmando as Permissões de Pasta
-rw-r--r--    1 YOURUSER  YOURGROUP       139 2007-12-15 22:50 .htaccess
drwxr-xr-x    3 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 config
drwxr-xr-x    3 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 controllers
-rw-r--r--    1 YOURUSER  YOURGROUP       953 2007-12-15 22:50 index.php
drwxr-xr-x    3 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 locale
drwxr-xr-x    3 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 models
drwxr-xr-x    2 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 plugins
drwxr-xr-x    5 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 tests
drwxr-xr-x    6 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 tmp
drwxr-xr-x    3 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 vendors
drwxr-xr-x    8 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 views
drwxr-xr-x    6 YOURUSER  YOURGROUP      4096 2007-12-15 22:50 webroot

A maneira mais simples de se fazer isso é, provavelmente, a mais comum e menos segura: dar permissões de gravação a todos:

chmod -R 777 app/tmp
ls -l app

As permissões para a pasta tmp devem ter sido atualizadas, como mostrado abaixo.

drwxrwxrwx    7 YOURUSER  YOURGROUP      2007-12-15 22:50 tmp

Conceder permissões de gravação a todos não é recomendado para uso geral. O ideal é que você altere a propriedade desta pasta para corresponder ao usuário utilizado pelo servidor da Web, ou inclua o usuário utilizado pelo servidor da Web em um grupo para o diretório e inclua permissões de gravação de grupo. Este tutorial deve demonstrar como utilizar o CakePHP e não foi projetado para ser um guia para a construção de aplicativos seguros. Embora a segurança devesse ser prioridade no desenvolvimento de qualquer aplicativo, uma discussão completa sobre as práticas seguras de PHP estão fora do escopo deste tutorial.

Para uma instalação de produção, altere o webroot do servidor da Web para app/webroot, que irá minimizar a quantidade de código acessível via navegador da Web e ajudará a melhorar a segurança de sua instalação.

Validação 1

Em um navegador, acesse a URL que corresponde ao webroot para seu servidor da Web. Por exemplo, se você tiver instalado o CakePHP no webroot do host local, acesse http://localhost; você deverá ver a página inicial padrão do CakePHP.

Figura 1. A Página Inicial Padrão do CakePHP como Ela Deve Ser Vista

Nota: Se a página inicial padrão for mais semelhante à Figura 2, então mod_rewrite não está funcionando conforme requerido pelo CakePHP. Às vezes isso pode ser um problema para usuários iniciantes.

Figura 2. A Página Inicial com Aparência Incorreta

A seguir estão algumas coisas que devem ser verificadas.

Seu Arquivo .htaccess Está Correto?

Você deve ter recebido acesso ao arquivo .htaccess no diretório de instalação do CakePHP. Na maioria dos sistemas *nix, isso ficará oculto da visualização por padrão. Se você não tiver o arquivo, verifique a origem que você transferiu por download ou obtenha uma nova atualização do CakePHP.org. Confirme se o arquivo existe e é válido acessando o diretório de instalação e executando cat .htaccess. Isso exibirá o conteúdo do arquivo, que deve ser semelhante à Listagem 4.

Listagem 4. Confirmando se o Arquivo .htaccess Existe
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

O mod_rewrite Está Ativado para o Servidor?

Certifique-se de que mod_rewrite esteja ativado para seu servidor da Web. Para Apache, existem duas linhas que devem aparecer no arquivo httpd.conf. Na lista LoadModule, você deve ver a seguinte linha (ou algo muito próximo disso): LoadModule rewrite_module libexec/mod_rewrite.so.

Na lista AddModule, você deve ver esta linha (ou algo muito próximo disso): AddModule mod_rewrite.c.

Se você não puder localizar essas linhas em seu arquivo httpd.conf, mod_rewrite não está ativado. Consulte a documentação do servidor para obter os detalhes sobre como fazer isso.

O Servidor Permite a Substituição de .htaccess?

Certifique-se de que seu servidor da Web esteja configurado para permitir a substituição de .htaccess. Para o Apache, cada diretório deve ser definido no arquivo httpd.conf. Essas definições podem parecer bastante diferentes de uma instalação para outra, mas ainda assim você deverá ver a linha AllowOverride All na definição. Sua definição pode ser semelhante à Listagem 5.

Listagem 5. Definições no Arquivo httpd.conf
   <Directory "/webroot">
       Options Indexes MultiViews
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>

Consulte a documentação do servidor para obter mais detalhes sobre a substituição de .htaccess.

Configurando uma Conexão com o Banco de Dados

Agora que você já tem o CakePHP instalado e está se entendendo bem com seu servidor da Web, é preciso introduzir o CakePHP em seu banco de dados. Esta seção cobrirá a definição da configuração do banco de dados e verificará se o CakePHP gosta do seu banco de dados. Tor vai precisar de um lugar para armazenar seus dados de usuário e produto. Em breve, você vai criar uma tabela de usuários para ser utilizada para a construção das partes de login e registro do Tor.

Editando o Arquivo de Configuração do Banco de Dados

A definição da configuração do banco de dados é muito fácil, mas antes de você começar, certifique-se de que seu banco de dados esteja em execução, de ter criado um banco de dados para seu aplicativo e de ter um nome de usuário e uma senha para um usuário com direitos ao banco de dados.

Para começar, faça uma cópia do arquivo app/config/database.php.default e salve-o como app/config/database.php. Faça isso para preservar uma cópia do modelo original. Abra o arquivo em seu editor de texto favorito e procure a seguinte seção (ela deve estar próxima da parte inferior do arquivo).

Listagem 6. O Arquivo app/config/database.php.default
var $default = array(
                'driver' => 'mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'user',
                'password' => 'password',
                'database' => 'database_name',
                'prefix' => ''
        );

Modifique estas informações para ajustar sua instalação:

driver
Pode ser mysql, mysqli, postgres, sqlite, mssql, db2, oracle, adodb ou pear-drivername. Este tutorial assume mysql.
persistente
Este campo diz ao CakePHP se ele deve utilizar conexão com o banco de dados persistente. Ele deve ser true ou false. Este tutorial assume false.
host
É o nome do host do servidor de banco de dados, como localhost ou mysql.yourdomain.
login
É o nome de usuário para seu login do banco de dados, como dbuser.
senha
É a senha para seu login do banco de dados, como secretsecret.
banco de dados
É o nome do banco de dados que você quer utilizar, como cakedev.
prefixo
Prefixo é uma cadeia, como cp_, que é colocada no início de nomes de tabela para qualquer chamada de banco de dados feita pelo CakePHP. O uso de um prefixo pode ser necessário se o banco de dados for compartilhado entre aplicativos para impedir que as tabelas se sobreponham umas as outras, onde dois ou mais aplicativos querem uma tabela com o mesmo nome, como usuários.

Não se esqueça de salvar o arquivo.

Qualquer número de configurações de banco de dados pode ser especificado no database.php, desde que elas tenham nomes distintos. Você pode especificar qual configuração do banco de dados o aplicativo deve utilizar nos modelos.

Algumas notas sobre bancos de dados e CakePHP:

  • As tabelas devem ter uma chave primária denominada id.
  • Se você incluir uma coluna criado ou modificado na tabela, o CakePHP irá preencher automaticamente o campo quando for apropriado.
  • Nomes de tabelas devem estar no plural (usuários, produtos, ovos, refrigerantes, vencedores, perdedores). Seus modelos correspondentes terão nomes no singular (usuário, produto, ovo, refrigerante, vencedor, perdedor).
  • Se as tabelas tiverem que ser relacionadas, as chaves estrangeiras deverão seguir o formato table_id com nomes de tabela no singular. Por exemplo, user_id, product_id, egg_id, soda_id, winner_id e loser_id seriam chaves estrangeiras para o usuário, o produto, o ovo, o refrigerante, o vencedor e o perdedor da tabela.

Validação 2

Retorne à URL que você utilizou para validar a instalação inicial. Você deverá ver que a página inicial padrão do CakePHP foi alterada para indicar o status da configuração do banco de dados.

Figura 3. Página Inicial Padrão do CakePHP Alterada para Indicar o Status da Configuração do Banco de Dados

Se a página inicial padrão disser que o arquivo de configuração do banco de dados não está presente, talvez você o tenha colocado no lugar errado ou nomeado incorretamente. Certifique-se de que o arquivo de configuração do banco de dados seja app/config/database.php. Se a página inicial padrão disser que o CakePHP não pode se conectar ao banco de dados, confirme se as informações de conexão inseridas são válidas e tente novamente.

Criando as Tabelas de Aplicativo

Até agora, o CakePHP, seu servidor da Web e seu banco de dados estão se comunicando bem. É hora de arregaçar as mangas e fazer o trabalho real. Tor precisa de uma tabela de usuários.

Esta tabela conterá as informações básicas necessárias para identificar e interagir com um usuário. Um simples campo de nome de usuário e senha provavelmente seria suficiente, mas outras informações podem ser úteis, como um endereço de e-mail (para o envio de pedidos de reconfiguração de senha), primeiro e último nomes (para personalização) e a data do último login (para ajudar a rastrear contas inativas). Provavelmente você quer que seus campos de nome de usuário e e-mail sejam exclusivos. E não se esqueça do campo de ID de chave primária. O SQL para a criação de sua tabela pode ser semelhante à Listagem 7.

Listagem 7. SQL para Criar Sua Tabela
CREATE TABLE 'users' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'username' VARCHAR( 40 ) NOT NULL ,
'password' VARCHAR( 40 ) NOT NULL ,
'email' VARCHAR( 255 ) NOT NULL ,
'first_name' VARCHAR( 40 ) NOT NULL ,
'last_name' VARCHAR( 40 ) NOT NULL ,
    UNIQUE (
        'username' ,,
             'email'
		)
) TYPE = MYISAM ;

Observe que os campos username, password, first_name e last_name têm um comprimento máximo de 40 caracteres. Nós forçaremos este comprimento de caracteres no modelo de usuário. O comprimento máximo de 40 caracteres, nesse caso, é totalmente arbitrário.


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.


Helpers

O Helpers no CakePHP existe principalmente para ajudar a acelerar o desenvolvimento de suas visualizações. Existem helpers para HTML, Ajax, JavaScript e mais. O Helpers facilita a inserção de partes de código HTML que você se pega gravando várias vezes.

Modificando o Arquivo users_controller.php

Para começar a utilizar o Helpers, você vai precisar modificar o arquivo users_controller.php criado anteriormente. Você deve dar um nome ao controlador e dizer a ele que quer utilizar alguns helpers, nesse caso, os helpers HTML e Formulário. Edite o arquivo para incluir as variáveis de classe $name e $helpers.

Listagem 14. O Controlador de Usuários
<?php
class UsersController extends AppController
{
    var $name = 'Users';

    var $helpers = array('Html', 'Form' );



    function register()

    {

...

Agora que incluiu seus helpers, você pode começar a utilizá-los.

Facilitando as Tabelas

Os usuários do Tor devem estar preparados para ver quem mais está registrado para utilizar o aplicativo. O CakePHP possui inúmeros helpers para ajudar você a criar tabelas. Esses helpers incluem várias partes úteis de funcionalidade, sendo que algumas delas você provavelmente já gravou mais de uma vez. Para demonstrar essa capacidade, você vai criar uma visualização para exibir usuários registrados.

Criando uma Ação knownusers

Comece criando uma ação knownusers no controlador de usuários.

Listagem 15. Criando uma Ação knownusers
function knownusers()
{
$this->set('knownusers',
$this->User->findAll(null, array('id', 'username', 'first_name',
'last_name'), 'id DESC')
);
}

Isso chama a função integrada findAll no modelo de usuário. A função findAll utiliza um campo contendo condições (nesse caso, você passou condições nulas, que retornarão todos os usuários), uma array de campos a serem retornados (não queremos todas as informações sobre o usuário, apenas as que você quer que todos vejam) e um campo de classificação e uma ordem (nesse caso, id DESC para classificar os campos em ordem decrescente por ID). Também é possível especificar um limite (máximo de linhas a ser retornado), uma página (se você estiver paginando os dados), uma opção recursiva, que pode ser especificada para retornar modelos associados aos dados (por exemplo, se você estava consultando uma tabela de grupos e vários usuários pertencerem a cada grupo).

A saída de findAll é colocada na variável knownusers. Os dados agora podem ser acessados a partir de uma visualização.

Criando a Visualização knownusers

Crie o arquivo app/views/users/knownusers.ctp em um editor de texto. Para ver com que os dados retornados por findAll se parecem, emita a variável knownusers utilizando var_dump.

Listagem 16. Emissão da Variável knownusers Utilizando var_dump
<pre>
<?php var_dump($knownusers) ?>
</pre>

Visite a visualização em http://localhost/users/knownusers. Você deverá ver uma array de dados do usuário.

Figura 7. Os Resultados

Se você tiver apenas um usuário listado, retorne a http://localhost/users/register e registre mais alguns. O resultado final será mais impressivo.

Conseguiu uma grande array de usuários? Ótimo! Hora de transformá-la em uma tabela. Substitua o conteúdo de knownusers.thtml pelo seguinte.

Listagem 17. Criando uma Tabela
<table>
<?php

echo $html->tableHeaders(array_keys($knownusers[0]['User']));

foreach ($knownusers as $thisuser)
{
	echo $html->tableCells($thisuser['User']);
}

?>
</table>

O primeiro auxiliar criará um conjunto de cabeçalhos de tabela a partir de uma array de dados — nesse caso, a lista de chaves para nossos usuários.

O segundo auxiliar criará um conjunto de células de tabela, envolvido por tags de linha da tabela, a partir de uma array de dados — nesse caso, os valores para cada usuário.

É isso! Salve-a e acesse http://localhost/users/knownusers para ver os resultados.

Figura 8. Os Resultados

Ao utilizar o auxiliar tableCells, você eliminou a necessidade de gravar seu próprio código para iteração através da array de dados do usuário. Esse é apenas um exemplo de como utilizar helpers para facilitar o trabalho com HTML no CakePHP.

Geração de Formulários

Construir um aplicativo da Web sem utilizar formulários é como ordenhar uma galinha: extremamente complicado e não funciona. Formulários bem construídos e de fácil manutenção são a base para qualquer aplicativo bem construído. Dada a frequência com que você vai precisar construir formulários, parece natural procurar formas de tornar o processo mais fácil sem cortar caminho.

Utilizando Helpers no Formulário de Registro

Helpers são úteis principalmente na geração de formulários. Você pode utilizá-los para gerar o HTML para seus campos de entrada, bem como sinalizadores de substituição para conter mensagens de erro de validação. Utilizando helpers para gerar os campos de formulário e portadores de mensagens de erro para o Tor, a visualização de registro pode ser muito mais parecida com a Listagem 18.

Listagem 18. Utilizando Helpers para Gerar o Formulário de Registro
<p>Please fill out the form below to register an account.</p>
<?php echo $form->create('User', array('action' => 'register'));?>

<?php
    echo $form->input('first_name');
    echo $form->input('last_name');
    echo $form->input('username');
    echo $form->input('email');
    echo $form->input('password');
?>

<?php echo $form->end('Register');?>

Como você pode ver, fazer uso dos helpers do CakePHP pode economizar um pouco do seu código durante a gravação de elementos do formulário básico. Agora vamos dar uma olhada em como fazer uso de seus helpers.

Tirando o Máximo Proveito dos Helpers

Para começar a extrair mais lucros dos helpers, você vai precisar fazer duas coisas: atualizar o controlador de usuários e introduzir um pouco de validação de dados.

Abra controllers/users_controller.php e altere a função do registro para corresponder a da Listagem 19.

Listagem 19. Atualizando o Controlador de Usuários
{
  if (!empty($this->data))
  {
    if ($this->User->save($this->data))
    {
      $this->Session->setFlash('Your registration information was accepted.');
    }
  }
}

Observe que as ocorrências de $this->params['form'] mudaram para $this->data.

Agora abra o modelo de usuário e inclua um pouco de validação de dados (coberta com detalhes mais adiante). Por enquanto, modifique seu modelo de usuário para que ele fique parecido com o da Listagem 20.

Listagem 20. Modificando Seu Modelo de Usuário
<?php
class User extends AppModel
{
  var $name = 'User';

  var $validate = array(
    'username' => VALID_NOT_EMPTY,
    'password' => VALID_NOT_EMPTY,
    'email' => VALID_EMAIL
  );
}
?>

Analisando tudo isso rapidamente, a array $validate contém entradas para validação, que consistem em uma chave (o nome do campo de formulário) e em uma expressão regular utilizada para avaliar os dados. Não é necessário validar todos os campos de formulário. Na Listagem 20, last_name e first_name foram deixados como opcionais. O CakePHP é fornecido com várias expressões regulares predefinidas para validação de dados. VALID_NOT_EMPTY é utilizada para garantir que o campo não está vazio. VALID_EMAIL é utilizada para verificar se uma cadeia se parece mais ou menos com um endereço de e-mail.

Agora vamos fazer um teste. Tente enviar o formulário sem dados, com um ou dois campos obrigatórios vazios, com um endereço de e-mail inválido. O que você vê?

Figura 9. Primeira Tentativa de Validação de Dados

Agora tente uma segunda vez, deixando dados diferentes ausentes.

Figura 10. Segunda Tentativa de Validação de Dados

Uma coisa que você deve observar é que o CakePHP está ativando e desativando suas mensagens de erro on the fly. Outra coisa que você vai observar é que o CakePHP está se lembrando e preenchendo os valores dos campos de formulário sem você precisar fazer nada.

É aqui que está a grande vantagem. Por que você não teve que fazer nada?

Primeiro, você não precisou dizer aos campos de formulário para preencher novamente suas informações a partir da array _POST. O CakePHP fez isso por você. Você não precisou verificar a existência de erros em cada campo e exibir condicionalmente cada mensagem de forma individual. O CakePHP fez isso por você. Você não precisou se certificar de ter formatado suas tags em um xhtml válido. O CakePHP também fez isso por você.

Notas sobre o Helper

Este tutorial examina superficialmente os helpers. Um tutorial inteiro poderia ser escrito sobre este assunto. Saber utilizar bem os helpers envolve um longo percurso para ajudá-lo a acelerar seu desenvolvimento no CakePHP. O CakePHP inclui helpers para Ajax (utilizando prototype.js), JavaScript, conversão de números, manipulação de texto, datas, horas e mais. Revise o manual (consulte Recursos) para se familiarizar com alguns desses helpers.


Validação de dados do CakePHP

Agora você vai dar uma rápida olhada na validação de dados do CakePHP inserindo um pouco de validação de dados para usuários com base em expressões regulares definidas. Ao definir suas próprias expressões regulares para validação de dados, você pode exercer um controle maior sobre os critérios de concluir/falhar para campos de formulário individuais no Tor.

O Modelo de Usuário do Tor

Dê outra olhada no modelo de usuário.

Listagem 21. O Modelo de Usuário
<?php class User extends AppModel {
  var $name = 'User';
  var $validate = array(
    'username' => VALID_NOT_EMPTY,
    'password' => VALID_NOT_EMPTY,
    'email' => VALID_EMAIL
  ); } ?>

Este é um bom começo, mas não é suficiente. Você vai querer se certificar de que os comprimentos de campos sejam respeitados e de que o nome de usuário ainda não exista. Isso será feito através da definição de suas próprias expressões regulares para validação e definição de uma função para verificar um nome de usuário em uma tabela de usuários antes de salvar o usuário.

Expressões Regulares (Resumo)

Uma discussão completa sobre expressões regulares está fora do escopo deste tutorial. O Manual de PHP contém informações sobre expressões regulares em PHP e você deve revisá-lo antes de querer ir mais longe na criação de suas próprias expressões regulares de validação de dados. Consulte Recursos para conhecer alguns links úteis.

Aexpressão regular é basicamente um padrão de caracteres utilizados para comparar uma cadeia com outra. Por exemplo, o caractere * em uma expressão regular corresponderá a qualquer caractere, inúmeras vezes. Se você não souber nada sobre expressões regulares, não se preocupe. O exemplo abaixo servirá como introdução.

Crie Sua Própria Validação

O CakePHP fornece algumas expressões regulares de validação de dados integradas, incluindo:VALID_NOT_EMPTY, VALID_NUMBER, VALID_EMAIL e VALID_YEAR. Essas constantes são definidas em cake/libs/validators.php e não devem ser modificadas, embora você possa achar útil revisá-las.

Para os campos de nome de usuário e senha, você precisa validar se os dados enviados não têm mais de 40 caracteres de comprimento. Também é muito útil verificar se o nome de usuário e a senha têm pelo menos seis caracteres. Uma expressão regular para corresponder a cadeias com um comprimento entre seis e 40 caracteres seria semelhante a esta: /^.{6,40}$/.

Lendo essa expressão regular da esquerda para a direita:

  • /— Marca o início da expressão regular
  • ^— Quer dizer do início da cadeia
  • .— Quer dizer qualquer outro caractere
  • {6,40}— Quer dizer pelo menos seis vezes, mas não mais de 40 vezes
  • $— Quer dizer e a cadeia termina
  • /— Marca o final da expressão regular

Portanto, lida como um todo, essa expressão regular quer dizer "do início da cadeia, um ou mais caracteres, pelo menos seis mas não mais que 40, e a cadeia termina."

Para colocar a expressão regular em uso (consulte a Listagem 22), substitua as instâncias de VALID_NOT_EMPTY pela expressão regular, entre aspas (para impedir o PHP de tentar interpretar quaisquer caracteres especiais).

Listagem 22. Expressão Regular em Script PHP
<?php
class User extends AppModel
{
  var $name = 'User';

  var $validate = array(
    'username' => '/^.{6,40}$/',
    'password' => '/^.{6,40}$/',
    'email' => VALID_EMAIL
  );
}
?>

Certifique-se de ter salvado todos os seus arquivos, retorne para http://localhost/users/register e tente registrar um usuário com um nome de usuário de quatro caracteres. Você deverá ver algo semelhante à Figura 11.

Figura 11. Validação de Dados

Expressões regulares são versáteis, mas não podem fazer coisas como dizer a você se um nome de usuário já foi registrado.

Levando a Validação Adiante

Às vezes você não consegue dizer se um dado é válido apenas olhando para ele. Por exemplo, o nome de usuário pode ter entre seis e 40 caracteres, mas você terá que verificar o banco de dados para saber se o nome de usuário já foi utilizado. O CakePHP fornece a capacidade de marcar manualmente um campo como inválido. Dê uma olhada no método beforeValidate na Listagem 23. Esse método seria incluído no modelo de Usuário.

Listagem 23. Validar o Nome do Usuário
 function beforeValidate() {
    if (!$this->id) {
        if ($this->findCount(array('User.username'
		                => $this->data['User']['username'])) > 0) {
            $this->invalidate('username_unique');
            return false;
        }
    }
    return true;
}

Esse método diz ao modelo que antes de qualquer validação ser executada, é necessário fazer uma verificação para saber se os dados enviados possuem um ID. Se não houver um ID, procure outros usuários com o mesmo nome de usuário. Se houver algum, marque o campo de nome de usuário inválido e ignore qualquer validação restante (return false). Você pode tirar o máximo proveito disso alterando a linha de entrada do nome do usuário na visualização register.ctp para o seguinte.

Listagem 24. Nova Linha de Entrada de Nome de Usuário
 echo $form->input('username', array('after' => $form->error
       ('username_unique', 'The username is taken. Please try again.')));

Isso diz à visualização de registro o que fazer quando encontrar mensagens de erro chamadas 'username_unique' que você designou no método beforeValidate.

Salve seus arquivos e tente novamente. Acesse http://localhost/user/knownusers para obter uma lista de usuários existentes. Em seguida, acesse http://localhost/user/register e tente criar um com o mesmo nome de usuário. Você deverá ver o seguinte.

Figura 12. Validação de Dados com Êxito

Uma boa validação de dados é uma etapa importante na criação de qualquer aplicativo seguro. Conforme você constrói o aplicativo Tor, procure oportunidades para melhorar a validação de dados. Não tenha medo de inserir mais validação de dados do que a demonstrada neste tutorial. Nunca acredite que seus usuários estão enviando os dados que você pediu. Valide tudo. O CakePHP facilita isso.


Preenchendo Lacunas

Até aqui, os usuários podem se registrar para seu aplicativo e ver quem já está registrado. O aplicativo precisa de alguns preenchimentos. Utilizando as qualificações obtidas até aqui, tente preencher mais funcionalidades. Consulte Parte 2 para obter exemplos do seguinte.

Login

A visualização de login deve reunir informações de login do usuário e enviá-las para o controlador de usuários. O controlador de usuários deve verificar se o usuário está no banco de dados e se a senha está correta. Se o usuário tiver efetuado login corretamente, grave o nome de usuário da sessão e envie o usuário para a ação index.

Sugestões:

  • Utilize a $this->User->findByUsername($your_username_variable_here) integrada para procurar o usuário no banco de dados
  • Grave o nome do usuário em Session com $this->Session->write('user', $your_username_variable_here)

Índice ação

A ação index deve verificar se o nome do usuário foi gravado na sessão. Se o nome do usuário tiver sido gravado na sessão, capture essas informações no banco de dados e cumprimente o usuário com uma saudação customizada. Se o usuário não tiver efetuado login, direcione-o para a ação login.

Logout

A ação logout deve excluir o nome do usuário da sessão e redirecionar o usuário para a ação login.

Bonificação

Modifique a ação register para registrar automaticamente o usuário no sistema e encaminhar o usuário para a ação index. Modifique as ações register e login para utilizar senhas geradas através de função hash em vez de salvar suas senhas no banco de dados como texto simples.

Não se preocupe se você "empacar". A Parte 2 fornece soluções de amostra para esses problemas. Depois você vai mergulhar de cabeça e vai construir a galeria do produto Tor.

Boa codificação!


Resumo

Este tutorial ensinou como instalar e configurar o CakePHP, os princípios básicos do design do MVC, como validar dados do usuário no CakePHP, como utilizar auxiliares do CakePHP e como ter um aplicativo ativo e em execução rapidamente utilizando o CakePHP. A Parte 2 cobre a gravação de plug-ins para seu aplicativo e o uso das listas de controle de acesso (ACLs) do CakePHP.


Download

DescriçãoNomeTamanhoMétodo de download
Part 1 source codeos-php-cake1.source.zip3KBHTTP

Informações sobre métodos de download

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=397006
ArticleTitle=Prepare Web Sites com Rapidez Utilizando CakePHP, Parte 1: Introdução
publish-date=05262014