Ir para conteúdo
Fórum Script Brasil
  • 0

MVC: o tutorial de Alexandre Bezerra Barbosa (2018)


Frank K Hosaka

Pergunta

Baseado no tutorial de Alexandre nesse endereço: PHP::CRUD COM MVC – Alexandre Bezerra Barbosa (wordpress.com) eu fiz algumas modificações, assim:


arquivo /Astudy/Controles/Controle.php
<?php
require_once $_SERVER['DOCUMENT_ROOT']."/Astudy/Modelos/Config.php";

class Controle {

public function view($arquivo, $array = null) {
    if (!is_null($array)) {
        foreach ($array as $var => $value) {${$var} = $value; } }
        ob_start();
        include VISOES . "$arquivo.php";
        ob_flush(); }
        
}

arquivo /Astudy/Controles/ControleContato.php
<?php

class ControleContato extends Controle {

private $Conexao;

public function __construct(){
    $this->Conexao=new Conexao();
    $conta=$this->Conexao->select("count(*) as conta from INFORMATION_SCHEMA.TABLES
         WHERE TABLE_NAME = 'contatos'")[0]->conta;
    if($conta==0){
        $this->Conexao->exec('create table contatos (
        id int unsigned auto_increment primary key,nome varchar(80) not null,
        telefone varchar(20) default null,email varchar(80) default null)'); }}

public function atualizar(){
    $id=$_POST['id'];
    $nome=$_POST['nome'];
    $telefone=$_POST['telefone'];
    $email=$_POST['email'];
    $this->Conexao->update("contatos set nome='$nome', telefone='$telefone', email='$email'
        where id=$id");
    return $this->listar();}
        
public function criar(){return $this->view('form');}

public function editar(){
    $id=$_GET['editar'];
    $contato=$this->Conexao->select("* from contatos where id=$id")[0];
    return $this->view('form', ['contato' => $contato]); }

public function excluir(){
    $id=$_GET['id'];
    $this->Conexao->delete("contatos where id=$id");
    return $this->listar();}
    
public function listar(){
    $contatos = $this->Conexao->select("* from contatos");
    return $this->view('grade', ['contatos' => $contatos]);}

public function salvar(){
    $nome=$_POST['nome'];
    $telefone=$_POST['telefone'];
    $email=$_POST['email'];
    $this->Conexao->insert("contatos (nome,telefone,email) values ('$nome','$telefone','$email')");
    return $this->listar();}

}

arquivo /Astudy/Index.php
<?php
require __DIR__ ."/Modelos/Config.php";
if($_GET){
    $comando=explode('_',key($_GET));
    $controle=new $comando[0];
    $funcao=$comando[1];
    if(count($comando)==3){
        $_GET[$funcao]=$comando[2];}
    call_user_func(array($controle,$funcao));} 
else {require VISOES . "inicio.php";}

arquivo /Astudy/Modelos/Conexao.php
<?php

class Conexao {

private static $conexao;

public function delete($sql){
    return $this->getInstance()->query("delete from $sql");}

public function exec($sql){
    return $this->getInstance()->query($sql);}

public static function getInstance() {
    if (is_null(self::$conexao)) {
        self::$conexao = new PDO('mysql:host='.HOST.';dbname='.DBNAME, USER, PASSWORD);
        self::$conexao->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        self::$conexao->exec('set names utf8');}
    return self::$conexao;}

public function insert($sql){
    return $this->getInstance()->query("insert into $sql");}

public function select($sql){
    $stmt=$this->getInstance()->query("select $sql");
    return $stmt->fetchAll(PDO::FETCH_OBJ);}

public function update($sql){
    return $this->getInstance()->query("update $sql");}
}

arquivo /Astudy/Modelos/Config.php
<?php
date_default_timezone_set('America/Sao_Paulo');
define("PROJETO",'Astudy');
defined('CONTROLES') || define('CONTROLES',$_SERVER['DOCUMENT_ROOT'].'/' .PROJETO . '/Controles/');
defined('MODELOS') || define('MODELOS',$_SERVER['DOCUMENT_ROOT'].'/' . PROJETO . '/Modelos/');
defined('VISOES') || define('VISOES',$_SERVER['DOCUMENT_ROOT'].'/' . PROJETO . '/Visoes/');
defined('HOST') || define('HOST',"localhost");
defined('DBNAME') || define('DBNAME',"diario");
defined('USER') || define('USER',"root");
defined("PASSWORD") || define('PASSWORD','');
spl_autoload_register(function($Class){
    $includeDir = false;
    $findDir = ['Controles','Modelos','Visoes'];
    foreach ($findDir as $DirName) {
        if (!$includeDir
            && file_exists(FindClass($DirName, $Class))
            && !is_dir(FindClass($DirName, $Class))) {
            include_once (FindClass($DirName, $Class));
            $includeDir = true;}}
    if (!$includeDir) {
        die("$Class - Erro interno no servidor ao encontrar dados 
            cruciais de funcionamento!");}});
function FindClass($dir, $class) {
    return (
        $_SERVER['DOCUMENT_ROOT']
        . DIRECTORY_SEPARATOR . PROJETO
        . DIRECTORY_SEPARATOR . $dir
        . DIRECTORY_SEPARATOR . $class . '.php');}


arquivo /Astudy/Visoes/basico.html
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<style> body {width:1000px;margin:0 auto} </style>

arquivo /Astudy/Visoes/form.php
<?php include "basico.html"; ?>
<div class="container">
    <form action="?ControleContato.<?php echo isset($contato->id) ? "atualizar&id={$contato->id}" : "salvar"; ?>" method="post" >
        <div class="card" style="top:40px">
            <div class="card-header">
               <span class="card-title">Contatos</span>
            </div>
            <div class="card-body"></div>
            <div class="form-group d-flex justify-content-end">
                <label style="width:10%">Nome:</label>
                <input type="text" class="form-control" name="nome" id="nome" 
                 value="<?php echo isset($contato->nome) ? $contato->nome : null; ?>" />
            </div>
            <div class="card-body"></div>
            <div class="form-group d-flex justify-content-end">
                <label style="width:10%">Telefone:</label>
                <input type="text" class="form-control" name="telefone" id="telefone" value="<?php
                echo isset($contato->telefone) ? $contato->telefone : null; ?>" />
            </div>
            <div class="card-body"></div>
            <div class="form-group d-flex justify-content-end">
                <label style="width:10%">Email:</label>
                <input type="text" class="form-control" name="email" id="email" value="<?php
                echo isset($contato->email) ? $contato->email : null; ?>" />
            </div>
            <div class="card-body"></div>

            <div class="card-footer">
                <input type="hidden" name="id" id="id" value="<?php echo isset($contato->id) ? $contato->id : null; ?>" />
                <button class="btn btn-success" type="submit">Salvar</button>
                <a class="btn btn-danger" href="?ControleContato.listar">Cancelar</a>
            </div>
        </div>
    </form>
</div>

arquivo /Astudy/Visoes/grade.php
<?php include "basico.html"; ?>
<h1>Contatos</h1>
<hr>
<div class="container">
    <table class="table table-bordered table-striped" style="top:40px;">
        <thead>
            <tr>
                <th>Nome</th>
                <th>Telefone</th>
                <th>Email</th>
                <th><a href="?ControleContato.criar" class="btn btn-success btn-sm">Novo</a></th>
            </tr>
        </thead>
        <tbody>
            <?php
            if ($contatos) {
                foreach ($contatos as $contato) {
                    ?>
                    <tr>
                        <td><?php echo $contato->nome; ?></td>
                        <td><?php echo $contato->telefone; ?></td>
                        <td><?php echo $contato->email; ?></td>
                        <td>
                            <a href="?ControleContato.editar.<?php echo $contato->id; ?>" class="btn btn-primary btn-sm">Editar</a>
                            <a href="?ControleContato.excluir&id=<?php echo $contato->id; ?>" class="btn btn-danger btn-sm">Excluir</a>
                        </td>
                    </tr>
                    <?php
                }
            } else {
                ?>
                <tr>
                    <td colspan="5">Nenhum registro encontrado</td>
                </tr>
                <?php
            }
            ?>
        </tbody>
    </table>
</div>

arquivo /Astudy/Visoes/inicio.php
<?php include "basico.html"; ?>
<h1>Contatos</h1><hr>
<div class="container">
Bem-vindo ao aplicativo MVC Contatos! <br /><br />
<a href="?ControleContato.listar" class="btn btn-success">Vamos Começar!</a></div>
     

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Para testar o código acima, você pode usar esse aplicativo em PHP, depois de salvar o código acima (tudo) no arquivo script.txt no diretório raiz do C:/Wamp64/www:

arquivo ScriptIn.php
<?php
if (!is_dir("Astudy")){
    mkdir("Astudy");
    mkdir("Astudy/Controles");
    mkdir("Astudy/Modelos");
    mkdir("Astudy/Visoes");}
$script=file_get_contents("script.txt");
$ocorrencias=substr_count($script,"arquivo /Astudy/");
$substring = "arquivo /Astudy/";
$posicao = [];
$posicao[0]=strpos($script,$substring);
for($i=1;$i<=$ocorrencias-1;$i++){
    $posicao[$i]=strpos($script,$substring,$posicao[$i-1]+1);}
$codigo=[];
for($i=0;$i<=$ocorrencias-2;$i++){
    $codigo[]=substr($script,$posicao[$i],$posicao[$i+1]-$posicao[$i]);}
$codigo[]=substr($script,$posicao[$ocorrencias-1],strlen($script)-$posicao[$ocorrencias-1]);
for($i=0;$i<=$ocorrencias-1;$i++){
    $lines=explode("\n",$codigo[$i]);
    $arquivo=trim(substr($lines[0],9));
    $criar=fopen($arquivo,"w");
    $tamanhoNome=strlen($arquivo)+9;
    $conteudo=trim(substr($codigo[$i],$tamanhoNome));
    file_put_contents($arquivo,$conteudo);
    fclose($criar);}
echo "Trabalho encerrado";

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

O código que eu publiquei é simplista, ele não usa o objeto Request e nem o objeto Contato que aparecem no tutorial original, isso porque reduzi todo o PDO para o método query, e deixei de lado o conceito de objeto estático, não sei quando vou usar esse tipo de objeto ou quando vou usar outros métodos do PDO.

O que eu mais gostei do tutorial foi do roteador, ele é o mais simples que eu encontrei na internet, ele usa duas chaves para identificar o destino do código, o controle e o seu método. Na minha versão, eu tirei as chaves.

Outra coisa bacana é autoload, o do tutorial só serve para quem colocar todos os arquivos no diretório raiz. Eu distribui os arquivos em pastas diferentes, logo o autoload tem que ser mais robusto, e tive a sorte de encontrar na internet. O problema é que a vida do autoload é bem curta. O melhor lugar para colocar o autoload é no controle principal, pois todas as outras classes vão invocá-lo, através do comando extends na hora de definir a classe. E sem dúvida o controle também é o mehor lugar para manter conectado todo o projeto à sessão. O tutorial não usa a sessão, mas eu usei no meu projeto. A sessão é importante para mim, essa foi a única forma que eu encontrei para voltar ao ponto de partida.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...