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

É possível criar um código MVC no PHP?


Frank K Hosaka

Pergunta

Semana passada, eu prometi ajudar o Lúcio a desenvolver um programa para um campeonato de tacos, usando o MVC do PHP.

O problema é que eu não sabia nada de MVC. Então eu peguei esse tutorial: MVC e PHP: Conceito de MVC e sua funcionalidade usando o PHP (devmedia.com.br).

Eu gostei do tutorial e fui adaptando ao novo estilo de codificar, mas na medida que fui avançando fui encontrando vários erros difíceis de corrigir.

Hoje decidi codificar o tutorial, e eu fui encontrando os mesmos erros que o PHP apontou nos meus códigos.

Aqui está o código corrigido do tutorial. No tutorial, o rapaz usa a variável $_REQUEST, mas ela é totalmente desnecessária. 

O rapaz tenta listar os clientes do banco de dados. Eu consegui chegar na listagem, o que eu não esperava é o formulário de apresentação do index.php estar junto com a listagem.

O problema é mais grave do que imaginei. Eu não sei como corrigir, e nem sei se é possível fazer o MVC no PHP.

index.php

<?php
if(isset($_GET['class'])){
    $classe=$_GET['class'];
    $metodo=$_GET['acao'];
    $classe.='Controller';
    require_once 'Controller/'.$classe.'.php';
    $obj=new $classe();
    $obj->$metodo();}
?>
<form>
    classe <input name=class value=Cliente>
    metodo <input name=acao value=listar>
    <input type=submit>
</form>
===============================================
View/cliente_view.php

<!DOCTYPE HTML PUBLIC "-//3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; chrset=UTF-8">
<title>Implementando MVC</title>
</head>
<body>
<table>
<tr>
<th>ID</th>
<th>Cliente</th>
</tr>
<?php foreach($jclientes as $cliente): ?>
<tr>
<td><?php echo $cliente->codp; ?></td>
<td><?php echo $cliente->pessoa; ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
================================================================
Model/Cliente.php

<?php
class Cliente{
    private $id, $nome;
    public function save(){}
    public function update(){}
    public function remove(){}
    public function listAll(){
        $mysqli=new mysqli("localhost","root","","laravel");
        $query=$mysqli->query("select codp, pessoa from tbpessoa limit 5");
        $fetch=$query->fetch_all(MYSQLI_ASSOC);
        return $fetch;
    }
}
==============================================================================
Controller/ClienteController.php

<?php
require_once 'Model/Cliente.php';
class ClienteController{
    public function listar(){
        $cliente=new Cliente();
        $clientes=$cliente->listAll();
        $jclientes=json_decode(json_encode($clientes,true));
        require_once 'view/cliente_view.php';
    }
}

 

Captura de tela 2023-08-17 204358.png

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Uma possível solução é deixar tudo na mão do controlador, até mesmo para você ir de um view para outro. Se um view quiser ir para outro, primeiro tem que pedir a benção do controlador, assim:

index.php

<?php
require_once 'Controller/controle.php';
$controle=new controle();
$controle->inicio();
==================================================
View/inicio.php

<?php
if(isset($_POST['lista'])){
    require_once root.'/Controller/controle.php';
    $controle=new controle();
    $controle->listar();
    exit;} ?>
<div style="width:500px;margin:0 auto;margin-top:200px">
<form method=post>
<input type=submit name=lista value="Ver 5 clientes">
</form>
</div>
===================================================
View/lista.php

<?php
if(isset($_POST['voltar'])){
    require_once root.'/Controller/controle.php';
    $controle=new controle();
    $controle->inicio();} ?>
<table><th>ID<th>Cliente
<?php foreach($clientes as $cliente): 
echo "<tr><td>$cliente->codp<td>$cliente->pessoa";
endforeach; ?>
</table>
<form method=post>
<input type=submit name=voltar value=Voltar>
</form>
====================================================
Model/conexao.php

<?php
define('root',realpath('.'));
class conexao{
    private $conexao;
    function __construct(){
        $host="localhost";
        $user="root";
        $password="";
        $dbname="laravel";
        $this->conexao=new mysqli($host,$user,$password,$dbname);}
    function consulta($sql){
        try {$query=$this->conexao->query($sql);
            $rows=$query->fetch_all(MYSQLI_ASSOC);
            return json_decode(json_encode($rows));}
        catch(Exception $e){
            echo $e->getMessage()."<br> conexao->consulta $sql";exit;}}
}
==========================================================================
Controller/controle.php

<?php
class controle{
    private $conexao;
    function __construct(){
        require_once realpath('.').'/Model/conexao.php';
        $this->conexao=new conexao;}
    function listar(){
        $sql="select * from tbpessoa limit 5";
        $clientes=$this->conexao->consulta($sql);
        require_once root.'/View/lista.php';}
    function inicio(){
        require_once root.'/View/inicio.php';}
}

 

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,5k
×
×
  • Criar Novo...