Usando switch…case ao invés de if…else

Eu sei que pra muita gente isso deve ser óbvio, mas pra mim não era. Eu estava construindo mais uma função de envio de mensagens por um formulário na nova versão do site d’aCoruja.com [que está sendo feito em CakePHP] e queria validar os dados do formulário. O CakePHP tem uma boa função de validação de formulários, mas isso só funciona se associado a um “Model”, e eu não tinha um “Model” pro meu formulário de envio de email [embora eu pudesse ter, deixando o modelo sem associação a nenhuma tabela de banco de dados].

O problema aqui é que eu teria que gerar a validação “on-the-fly”, dependendo do comportamento do usuário. Eu já havia feito algo similar antes e o código ficou feio e gigante, cheio de if’s…elseif’s…elseif’s e assim por diante, até que todas as comparações fossem feitas.

Foi então que perguntei no canal de IRC do CakePHP se era possível usar um parâmetro genérico em switch pra fazer as comparações que eu quisesse. Me disseram que usar switch(true) seria válido [para saber mais sobre a sintaxe básica de switch, clique aqui]. Deste jeito, eu não precisaria determinar apenas uma variável para comparação, e ir comparando as variáveis nos cases de acordo com a necessidade. Olha só como ficou meu código:

$captcha = $this->Session->read('captcha');
switch(true) {
case (empty($this->data['User']['name'])):
$this->Session->setFlash(MISSING_FIELDS);
$this->User->invalidate('name');
$this->render();
break;
case (!preg_match(VALID_EMAIL, $this->data['User']['email'])):
$this->Session->setFlash(MISSING_FIELDS);
$this->User->invalidate('email');
$this->render();
break;
case (empty($this->data['User']['msg']));
$this->Session->setFlash(MISSING_FIELDS);
$this->User->invalidate('msg');
$this->render();
break;
case ($this->data['User']['captcha'] != $captcha);
$this->Session->setFlash(MISSING_FIELDS);
$this->User->invalidate('captcha');
$this->render();
break;
default:
$to = $data['User']['email'];
$subject = 'aCoruja.com - Contato Via aCoruja.com';
$message = $this->data['User']['msg'];
$headers = "From: ".$this->data['User']['name']." data['User']['email'].">\r\n";
if (mail($to, $subject, $message, $headers)) {
$this->Session->setFlash('Seu e-mail foi enviado com sucesso!');
$this->redirect('/users/view/'.$id);
} else {
$this->Session->setFlash('Ocorreu um erro no envio de sua mensagem. Tente novamente ou entre em contato conosco!');
$this->redirect('/users/msg/'.$id);
}
break;
}

Ah sim! Existe também a vantagem de que o switch é um pouquinho mais rápido que o if. Nada de demais no entanto! Qualquer dúvida ou sugestão, é só comentar! Abraços!