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.
|