1
resposta

Problema com PDO

Senhores, boa noite, estou tendo dificuldade para popular os set da minha quando a classe possui o método construtor. No exemplo abaixo, a classe Funcao com o array da minha consulta com PDO. Alguém poderia me explicar o que estou fazendo errado ?

Classe função

<?php



{

    private $id;
    private $nome;

    public function __construct($nome)
    {
    $this->nome = $nome;
    }

    public function getId()
    {
    return $this->id;
    }

    public function setId($id)
    {
    $this->id = $id;
    }

    public function getNome()
    {
    return $this->nome;
    }
}

O método inserir da classe FuncaoDao está funcionando normalmente, ou seja, consigo inserir novas funções no banco de dados, enquanto meu problema está no método listar, isso por causa do construtor da classe. Como faço para passar o atributo $nome pela linha $funcoes = $conexao->query(\PDO::FETCH_CLASS, Funcao::CLASS);

<?php

class FuncaoDao 
{

    public function inserir(Funcao $funcao)
    {
    $query  = "INSERT INTO funcoes(nome) VALUES (:nome)";
    $conexao = Conexao::pegarConexao();
    $stmt = $conexao->prepare($query);
    $stmt->bindValue(':nome',$funcao->getNome());
    $stmt->execute();

    }
    public static function listar()
    {
        $funcoes = array();
        $query = "SELECT id,nome FROM funcoes ORDER BY nome ASC";
        $conexao = Conexao::pegarConexao();
        $funcoes = $conexao->query(\PDO::FETCH_CLASS, Funcao::CLASS);
        return $funcoes;
    }

Quando chamo a function listar uma mensagem de erro é exibida informando que nenhum parâmetro foi passado para o construtor da classe função.

<?php
$funcoes = FuncaoDao::listar();
foreach($funcoes as funcao) :
    echo $funcao->getId()." - ".$funcao->getNome();
    echo"</br:>";
endforeach;
?>

1 resposta

Oi Gerson, tudo bom?

Realmente, nesse caso o construtor vai dificultar a construcao dos objetos pelo fetch.

Acho que a abordagem mais pratica aqui e tornar opcional esse parametro no construtor. Isso, inclusive, e bem comum quando usamos ORMs tambem, pelo mesmo motivo.

Para tornar o parametro opcional, basta atribuir um valor padrao. Algo como:

    public function __construct($nome = null)

Agora seu fetch vai funcionar =)

Outra abordagem possivel e desabilitar o construtor e passar as propriedades depois. Isso pode ser feito com o FETCH_PROPS_LATE

Ja passei por esse mesmo problema ao escrever um curso de testes. Da uma olhada nesse repositorio aqui:

https://github.com/andrechavesg/PHP-TESTES-DAO/blob/master/src/br/com/caelum/leilao/dao/UsuarioDao.php

Acho que vai te ajudar com algumas referencias =)

Qualquer problema e so falar!

Abraco.