Páginas

sexta-feira, 11 de janeiro de 2013

Bind entre Formulário HTML e POPO




No artigo anterior expliquei como popular um POJO (plain old java object) automaticamente a partir do request. Nesse artigo explicarei como implementar isso em PHP (POPO = plain old PHP object).


Vamos ver um cenário típico:

Definição da Classe:


<?php
class Pessoa {
   private $id;
   private $nome;
   private $email;
   private $telefone;

   //getters e setters
}
?>

Formulário HTML para cadastro:


<form action="cadastrar.php" method="post">
      Nome: <input type="text" name="nome" /><br/>
      Email: <input type="text" name="email" /><br/>
      Telefone: <input type="text" name="telefone" /><br/>
      
      <input type="submit" value="Cadastrar" />
</form>

Arquivo cadastrar.php

<?php
require_once 'Pessoa.php';
$pessoa = new Pessoa();
$pessoa->setNome($_REQUEST['nome']);
$pessoa->setEmail($_REQUEST['email']);
$pessoa->setTelefone($_REQUEST['telefone']);
//salva a pessoa no DAO
?>

Esse processo não é produtivo e muito entediante, especialmente se possuir muitos campos. Podemos usar um excelente recurso do PHP para automatizar tarefas repetitivas: Reflection.

Vejamos como poderíamos melhorar o processo:

Arquivo cadastrar.php

<?php
//Função que popula um objeto qalquer com dados do request.

public function populateFromRequest($object) {
        $reflectionClass = new ReflectionClass(get_class($object));
        foreach ($_REQUEST as $name => $value) {
            try {
                $typeProperty = $reflectionClass->getProperty($name);
                $typeProperty->setAccessible(true);
                $typeProperty->setValue($object, $value);
            } catch (Exception $exc) {}
        }
    }


require_once 'Pessoa.php';
$pessoa = new Pessoa();
populateFromRequest($pessoa, 'Pessoa');

//salva a pessoa no DAO
?>

A função populateFromRequest procura no objeto as propriedades cujos nomes coincidam com os nomes dos campos guardados no $_REQUEST, quando os nomes batem o valor da propriedade é setada com o valor do campo no $_REQUEST.

Essa função deverá ser isolada pois pode ser usada em outras situações com objetos diferentes.

Atenciosamente,
Gustavo Marques


Nenhum comentário:

Postar um comentário

Veja também

Related Posts Plugin for WordPress, Blogger...