CRUD básico em PHPoo

Fiz um estudo para melhorar os sistemas online que desenvolvo e venho compartilhar alguns conceitos com vocês.

Me baseei em um artigo do blog do Alexandre Bezerra Barbosa sobre CRUD com MVC usando PHP, vou deixar o link do artigo no final deste post.

Bom vamos iniciar com alguns pontos importantes para entender como a automação do código se processa.

Utilizando as funções do php spl_autoload_register e call_user_func temos um recurso muito interessante para carregar de forma autônoma nossa classes, uma vez que precisamos que as mesmas tenham o mesmo nome do arquivo onde estão escritas. Observerm este index.php

[index.php]

<?php
    //Iniciando a sessão:
    if (session_status() !== PHP_SESSION_ACTIVE)
        {
        //Definindo o prazo para a cache expirar em 1 minutos.
          session_cache_expire(1);
          session_start();
        }
    error_reporting(E_ALL);
    ini_set('display_errors', true);

    spl_autoload_register(function($class)
        {
       if (file_exists("lib/$class.php"))
           {
          require_once "lib/$class.php";
          return true;
            }
        });
    //print_r($_SESSION);
    $pagina = new Visao();
    if ($_GET)
        {
        $controller = isset($_GET['controller']) ? ((class_exists($_GET['controller'])) ? new $_GET['controller'] : NULL ) : null;
        $method     = isset($_GET['method']) ? $_GET['method'] : null;
      if ($controller && $method)
          {
         if (method_exists($controller, $method))
             {
            $parameters = $_GET;
            unset($parameters['controller']);
            unset($parameters['method']);
            call_user_func(array($controller, $method), $parameters);
            }
         else
             {
            $msg = "Método não encontrado!";
            }
         }
      else
          {
         $msg = "Controller não encontrado!";
         }
      }
   else
       {
      $msg = "Página Inicial";
      }
   $pagina->mensagem = $msg;
   if ( isset($_SESSION['login']) )
       {
       if ($_SESSION['login'] == 0)
           {
           $pagina->titulo = "Página Principal";
           $pagina->visualizar("login");
           }
          else
           {
           $acesso = unserialize($_SESSION['usuario']);
           $pagina->titulo = "Página Principal";
           $pagina->visualizar("dashboard");
           //print_r($_SESSION);
            $pagina->setVariable("usuario",$acesso->name);           
           }
       }
   else
        {
        $pagina->titulo = "Pagina Principal";
        $pagina->visualizar("login");
        }
?>

Nesse ponto podemos observar que a chamada da classe é feita pelo spl_autoload_register em conjunto com call_user_func, uma responsável por registrar a classe e outra por chamar o método solicitado passando os devidos parâmetros.

Para a conexão com o banco de dados utilizei PDO usando métodos estáticos para retornar a conexão. Esse arquivo não teve muita modifição pois o original já está em perfeito funcionamento.

[lib/Conexao.php]

<?php
    /**
     * Arquivo: Conexao.php
     * @package Default
     * @sub-package Classe de Conexão com o Banco de dados
     * @page-level 1
     */

require_once("parametros.inc");

    /**
     * Classe de Conexão com o Banco de dados
     * @package Default
     * @return void
     */
class Conexao
    {
    /**
     * Ponteiro de conexão com o banco de dados
     * @access private
     * @var mixed
     */
   private static $conexao;

    /**
     * Construtor da Classe CONEXAO
     * @return void
     */
   private function __construct()
        {
        }
        
    /**
     * Destrutor da Classe CONEXAO
     * @return void
     */
   private function __destruct()
       {
       }

    /**
     * Método public utilizado para retornar a conexão com o banco de dados.\n
     * @return mixed
     */
    public static function getInstance()
        {
      if (is_null(self::$conexao))
          {
          try
              {
              $options = array(
                PDO::ATTR_PERSISTENT => true
                );
             self::$conexao = new \PDO(str_conection,usuario,senha,$options);
             //self::$conexao->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
             //self::$conexao->exec('set names utf8');
             }
         catch (PDOException $e)
                {
                die('Connection failed: ' . $e->getMessage());
                }
           }
      return self::$conexao;
        }
};

Para cada tabela do banco de dados cria-se um arquivo de manipulação e controle, ou seja, um arquivo para tratar os dados para fazer get ou set no banco e outro para criar os forms e mostrar os resultados, criei uma classe a mais para a parte de visualização dos dados, essa classe usei um recurso o HTML_Sigma_Template (https://pear.php.net/package/HTML_Template_Sigma) para padronizar o visual e deixar separado do código do sistema, porém tive que fazer alguns ajustes na classe fornecida pois para algumas versões do PHP ela retorna warnings e erros que precisam ser tratados.

[lib/Usuario.php]

<?php
    
    class Usuario extends Funcoes
        {
        private $atributos;
        
        public function __construct()
            {
            }
            
        public function __destruct()
            {
            }
            
        public function __set($atributo, $valor)
            {
          $this->atributos[$atributo] = $valor;
          return $this;
            }
    
       public function __get($atributo)
           {
          return $this->atributos[$atributo];
            }
    
       public function __isset($atributo)
            {
          return isset($this->atributos[$atributo]);
            }
       
       /**
         * Salvar o contato
         * @return boolean
         */
       public function save($modo)
            {
            $colunas = $this->preparar($this->atributos);
            if ($modo == 0)
                {
            $query = "INSERT INTO admin (".
                implode(', ', array_keys($colunas)).
                ") VALUES (".
                implode(', ', array_values($colunas)).");";
                }
            else
                {
            foreach ($colunas as $key => $value)
                {
               if ($key !== 'iduser')
                   {
                  $definir[] = "{$key}={$value}";
                    }
                }
            $query = "UPDATE admin SET ".implode(', ', $definir)." WHERE iduser='{$this->iduser}';";
                }
            //echo ($query);
            if ($conexao = Conexao::getInstance())
                {
            $stmt = $conexao->prepare($query);
            if ($stmt->execute())
                {
               return $stmt->rowCount();
                }
                }
            return false;
            }

        /**
       * Retorna uma lista de contatos
       * @return array/boolean
       */
        public static function all()
            {
            $conexao = Conexao::getInstance();
            $stmt    = $conexao->prepare("SELECT * FROM admin;");
            $result  = array();
            if ($stmt->execute())
                {
            while ($rs = $stmt->fetchObject(Usuario::class))
                {
               $result[] = $rs;
                }
                }
            if (count($result) > 0)
                {
            return $result;
                }
            return false;
            }

        /**
       * Retornar o número de registros
       * @return int/boolean
       */
        public static function count()
            {
            $conexao = Conexao::getInstance();
            $count   = $conexao->exec("SELECT count(*) FROM admin;");
            if ($count)
                {
            return (int) $count;
                }
            return false;
            }

        /**
       * Encontra um recurso pelo id
       * @param type $id
       * @return type
       */
        public static function find()
            {
            $conexao = Conexao::getInstance();
            if (func_num_args() == 1)
                {
                $consulta = "SELECT * FROM admin WHERE iduser=".func_get_arg(0).";";
                }
            else if (func_num_args() == 2)
                {
                $consulta = "SELECT * FROM admin WHERE username='".func_get_arg(0)."' and password='".func_get_arg(1)."';";
                }
            else
                {
                return false;
                }
            //echo ($consulta);
            $stmt = $conexao->prepare($consulta);
            if ($stmt->execute())
                {
            return $stmt->fetchObject(Usuario::class);
                }
            return false;
            }

        /**
       * Destruir um recurso
       * @param type $id
       * @return boolean
       * Rever esse método questão: temporiedade
       */
        public static function destroy($id)
            {
            $conexao = Conexao::getInstance();
            /* Opção de exclusão total
            if ($conexao->exec("DELETE FROM sec_loginusers WHERE login='{$id}';"))
                {
            return true;
                }
            */
            if ($conexao->exec("UPDATE admin SET active='' WHERE iduser='{$id}';"))
                {
                return true;
                }
            return false;
            }
        };
?>

[lib/UsuarioController.php]

<?php

    class UsuariosController extends Controller
        {

        /**
          * Lista de Usuários
       */
        public function listar()
            {
            $acesso = unserialize($_SESSION['usuario']);
            //var_dump($acesso);
            $contatos = Usuario::all();
           $visao = new Visao();
           $visao->visualizar("grade");
           $visao->setVariable("titulo","Usuarios del Sistema");
           $visao->setCurrentBlock("USUARIOS");
           if (strcmp(trim($acesso->priv_admin),"Y") == 0 )
               {
               $visao->setVariable("ativon","");
               }
           else
               {
               $visao->setVariable("ativon","style=\"visibility:hidden;\"");
               }
           foreach ($contatos as $contato)
            {
            $visao->setCurrentBlock("DADOS");
            $visao->setVariable("codigo",$contato->login);
            $visao->setVariable("name",$contato->name);
            $visao->setVariable("email",$contato->email);
            $valor = "No";
            if (strcmp(trim($contato->priv_admin),"Y") == 0)
                {
                $valor = "Sí";
                }
            $visao->setVariable("priv_admin",$valor);
            if (strcmp(trim($acesso->priv_admin),"Y") == 0 )
                   {
                $visao->setVariable("ativo","");
                   }
               else
                   {
                   $visao->setVariable("ativo","style=\"visibility:hidden;\"");
                   }
               $visao->parseCurrentBlock("DADOS");              
            }
         $visao->parseCurrentBlock("USUARIOS");
            //return $this->view('grade', ['contatos' => $contatos]);
            }

        /**
       * Mostrar formulario para criar um novo contato
       */
        public function criar()
            {
            //modificar depois
            $visao = new Visao();
           $visao->visualizar("form_usuario");
           $visao->setVariable("titulo","Registro de usuarios del sistema");
         $visao->setVariable("acao","salvar");
         $visao->setCurrentBlock("SENHA_NEW");
         $visao->setVariable("pswd","");
         $visao->parseCurrentBlock("SENHA_NEW");
         $visao->setCurrentBlock("ADMINISTRADOR");
         $visao->setVariable("a_valor","Y");
         $visao->setVariable("a_selecionado","");
         $visao->setVariable("a_texto","Sí");
         $visao->parseCurrentBlock("ADMINISTRADOR");
         $visao->setCurrentBlock("ADMINISTRADOR");
         $visao->setVariable("a_valor","");
         $visao->setVariable("a_selecionado","CHECKED");
         $visao->setVariable("a_texto","No");
         $visao->parseCurrentBlock("ADMINISTRADOR");
            //return $this->view('form');
            }

        /**
       * Mostrar formulário para editar um contato
       */
        public function editar()
            {
            $id      = $this->request->id;
            $contato = Usuario::find($id);
            $visao = new Visao();
           $visao->visualizar("form_usuario");
           $visao->setVariable("titulo","Actualización de datos de usuario");
           $visao->setVariable("acao","atualizar");
         $visao->setVariable("login",$contato->login);
         $visao->setVariable("name",$contato->name);
         $visao->setVariable("email",$contato->email);
         $visao->setCurrentBlock("SENHA_EDIT");
         $visao->setVariable("pswd","Cambio");
         $visao->parseCurrentBlock("SENHA_EDIT");
         $admin[0] = array ('a_valor'=>'Y','a_texto'=> 'Sí');
         $admin[1] = array ('a_valor'=>'','a_texto'=> 'No');
         for ($i=0; $i < count($admin); $i++)
             {
             //echo ("id $i".strlen($contato->priv_admin)." ".strlen($admin[$i]['a_texto']));
             $visao->setCurrentBlock("ADMINISTRADOR");
             $visao->setVariable("a_valor",$admin[$i]['a_valor']);
             if (strlen(trim($contato->priv_admin)) == strlen(trim($admin[$i]['a_valor'])) )
                 {
                 $visao->setVariable("a_selecionado","CHECKED");
                 }
             else
                 {
                 $visao->setVariable("a_selecionado","");
                 }
             $visao->setVariable("a_texto",$admin[$i]['a_texto']);
             $visao->parseCurrentBlock("ADMINISTRADOR");
             }
         //return $this->view('form', ['contato' => $contato]);
            }

        /**
       * Salvar o contato submetido pelo formulário
       */
        public function salvar()
            {
            $contato           = new Usuario;
            $contato->login = $this->request->login;
            $contato->pswd = md5($this->request->pswd);
            $contato->name     = $this->request->name;
            $contato->email    = $this->request->email;
            $contato->priv_admin = $this->request->priv_admin;
            $contato->active = "Y";
            if ($contato->save(0))
                {
            return $this->listar();
                }
            }

        /**
          * Atualizar o contato conforme dados submetidos
          */
        public function atualizar()
            {
            $id                = $this->request->login;
            $contato           = Usuario::find($id);
            $contato->login = $this->request->login;
            $contato->name     = $this->request->name;
            $contato->email    = $this->request->email;
            $contato->priv_admin = $this->request->priv_admin;
            $contato->save(1);

            return $this->listar();
            }

        /**
       * Apagar um contato conforme o id informado
       */
        public function excluir()
            {
            $id      = $this->request->login;
            $contato = Usuario::destroy($id);
            return $this->listar();
            }
            
        /**
         * Verificar acesso ao Sistema
         * @param dados mixed
         * @return bool
         */
        public function logar()
            {
            //print_r($this->request);
            $login = $this->request->login;
            $senha = md5($this->request->pwd);
            $usuario = Usuario::find($login, $senha);
            if ($usuario)
                {
                session_unset();
                $_SESSION['login'] = 1;
                $_SESSION['usuario'] = serialize($usuario);
                //var_dump($_SESSION);
                }
            else
                {
                session_unset();
                $_SESSION['login'] = 0;
                }
            //var_dump($usuario);
            header("Location: index.php");                        
            }
            
        public function logout()
            {
            session_unset();
            $_SESSION['login'] = 0;
            header("Location: index.php");
            }
        };

Como é um código base, pode não inseri todos os elementos para funcionar corretamente, mas com um pouco de estudo não terão dificuldades de colocar ele para funcionar.

Segue abaixo a fonte de consulta que me baseei para o desenvolvimento destes códigos e os códigos para vossa apreciação, com tempo escrevei mais e melhorarei o conteúdo deste artigo.

Fonte: https://alexandrebbarbosa.wordpress.com/2018/06/28/phpcrud-com-mvc/

Código Fonte: base-crud-php.tar.xz

Share this content: