PHP Data Object (PDO) de maneira Produtiva: construindo uma classe CRUD — Parte 2
Na primeira parte dessa série de publicações vimos como montar uma classe de conexão com o banco de dados bem versátil, à qual você consegue manipular todas as opções através de uma folha de configuração inicializada pelo Gerenciador de Dependências do PHP, o Composer, que disponibiliza globalmente o que ali foi definido.
Nesta publicação aprenderemos como componentizar a rotina de CRUD, que é o acrônimo de create, read, update e delete, para persistir, ler e filtrar, além de destruir dados do banco de maneira versátil.
Construindo a Classe CRUD, para trazer dinamismo para aplicação.
Cada método desta classe, como mostra o exemplo abaixo, faz o chamamento da classe que construímos a priori, na publicação anterior, e realiza, caso haja conexão com o banco de dados, aquilo que se propõe.
A classe será composta pelas seguintes propriedades:
private $fail — Responsável por armazenar as exceções (\PDOException) do PDO;
private $query — Todas as ‘queries’ que são construídas em cada um dos métodos são armazenadas nesta propriedade;
private $params — Uma boa prática quando trabalhamos com o PDO é trabalhar com bind params, esta propriedade irá armazenar cada um desses parâmetros como uma string, para que sejam manipulados da maneira mais segura.
private static $table — Note que esta propriedade foi definida como estática, pois possibilitará o endereçamento de qual tabela presente no banco de dados sofrerá, naquele instante, a ação à qual um determinado método se destina.
Getters and Setters
Métodos de Obtenção (Getters)
public function getFail() — Retorna, quando existente, uma Exceção PDO;
public function getQuery() — Retorna a query que foi contruída naquele momento, para fim de consulta ou reaproveitamento;
Métodos de Configuração (setters)
public static function setTable(string $table) — Quando chamado, esse método retorna uma nova instância da classe CRUD, permitindo reconfigurar todos os comportamentos que se deseja de acordo à tabela aqui configurada no seu parâmetro.
public function setQuery(string $query) — Este método permitirá uma abordagem bem dinâmica com o PDO, portanto, há a possibilidade de criar queries à maneira que se desejar escrever, portanto, este método existe para garantir esse comportamento.
public function setParams($params) — Todas as vezes que se faz necessário ter parâmetros numa determinada consulta, escrita ou exclusão, este método é invocado. Seja internamente, nos métodos que serão explanados abaixo, ou por fora, para implementação qualquer utilizando esta classe.
Leitura de dados no Banco
Como é possível analisar o código abaixo, o método ‘fetch()’ se encarrega de preparar a query na Instância PDO e, caso encontre dados, retornará o objeto, para que o método ‘read()’, que veremos a seguir, se encarregue de parametrizar o retorno.
Método fetch()
Entendendo o Método read()
Quem fará toda a manipulação do método fetch()
é o read()
, como mostra o código abaixo. É ele quem se encarregará de manipular o retorno como um array contento vários objetos com a fetchClass
definida no parâmetro ou um objeto onde o seu atributo $data
vai estar recebendo o retorno do banco.
Observação: Por padrão a classe de retorno não seja definida do parâmetro, ele adotará uma instância \stdClass()
para realizar o fetch()
;
Inserindo Dados no Banco
O bloco try/catch abaixo se encarrega de configurar as colunas e os valores advindos do array $data
passados através do parâmetro do método create
, onde a variável $columns
corresponde às colunas e a variável $values
(bind) aos seus respectivos valores.
$columns = implode(“, “, array_keys($data));
Busca cada chave do array e as monta como uma string separada por vírgula e espaço. Como mostrado abaixo:
$data = [ ‘fullname’ => ‘Ada Lovelace’, ‘birth’=> ‘1815–12–10’];
Portanto, a coluna seria montada assim:
Colunas:
‘fullname, birth’
;
Sob a mesma lógica, os valores são montados com os devidos binds das colunas:
$values = “:” . implode(“, :”, array_keys($data));
Valores:
‘:fullname, :birth’
;
Por último, após executar o método execute do PDO, envelopado por um método de filtro (também presente nesta classe), o retorno deste método, caso não hajam falhas na inserção de dados, é feita através do método ‘lastInsertId()’
, para que retorne o ID
(chave primária) desta última inserção no Banco de Dados.
Atualizando Dados no Banco
O método de atualização dispõe de dois parâmetros, um array que receberá os dados e os termos (afinal, pense no caos que seria executar uma atualização sem termos… Bom, é melhor nem imaginar) para que esta ação seja realizada com sucesso.
Nesta rotina, o tratamento que é feito no parâmetro $data
se assemelha ao do create()
, porém aqui faz-se necessário um laço de repetição através de um foreach
, ao qual trazemos a chave do array $data
para montar as colunas e a atribuirmos a um bind
do mesmo nome.
Por final, o array que recebeu cada uma das strings montadas é unido com uma vírgula e um espaço, para ser inserido na query de atualização, como mostrado abaixo;
Excluindo Dados do Banco
O método de exclusão disponibiliza dois parâmetros o primeiro consiste nos termos ($terms
) da exclusão, para que filtre o dado que será excluído e, até mesmo, proteja o seu banco de uma possível exclusão indesejada. Enquanto o segundo é opcional, pois se trata dos parâmetros para ser adicionado à query de exclusão, como exemplifcado abaixo.
Contando os dados Retornados.
Enquanto que a maioria dos métodos supramencionados montam as suas próprias queries, este método depende de uma consulta feita para se utilizar e instanciar o método rowCount()
do PDO e então retornar a quantidade de registros encontrados. Vide código abaixo.
Métodos Auxiliares
Durante toda a execução de cada método público, sois método essenciais se fazem disponíveis internamente na classe CRUD para filtrar os dados e tratar dos parâmetros que são inseridos por meio de outros métodos, são eles:
private function parseParams($params) — Encarrega-se de fazer um parse nas strings, a fim de disponibilizá-las como variáveis dentro da propriedade $params
da classe CRUD;
private function filter (array $data) — Este é o responsável por aplicar um filtro default em cada um dos índices do array $data
recebido como parâmetro e instanciado nos métodos de escrita update()
e create()
.
Por fim, vimos aqui como construir uma classe organizada para ser a responsável de executar um CRUD completo de maneira componentizada. Na próxima publicação desta mesma série nós veremos como utilizar essa classe para construir um query builder enxuto, porém versátil e útil.
Eis a nossa Classe CRUD toda montada.
Espero que você tenha gostado dessa forma de trabalhar, abstraindo o PDO, de maneira a facilitar a implementação em qualquer projeto que venha desenvolver aplicando PHP, além de ter margem para poder melhorar seus recursos e contruir componentes outros que necessitem dessa base.
Onde aprendi PHP: UpInside Treinamentos
Referência: PDO | PHP.net