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: