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

Como fazer funcionar o meu segundo código MVC?


Frank K Hosaka

Pergunta

Eu cansei de ver os tutoriais espalhados na internet e também das sugestões do Bard. Eu estou indignado. Eu sou o único usuário no planeta que não pode escrever "localhost/astudy" no navegador. Agora, para contornar o problema estou escrevendo "localhost/a_study". Claro que dá para resolver isso com um curso de pós graduação de WampServe ou Windows 11, mas a minha meta era estudar o MVC.

Assim, a minha saída para estudar o MVC é esquecer os tutoriais. Nada de mexer no .htacess, nada de mexer no Composer, nada de copiar o Router.php do Bard, e nada de criar as pastas Controllers, Models e Views.

Assim, tudo o que restou na pasta a_study foi o index.php. Logo, é nele que vou começar o meu segundo código MVC.

Todos os tutoriais usam o método POST. Só que eu não consigo enxergar nada no cabeçalho do navegador. Como sou novato no MVC, nada me impede de usar o método GET.

Eu consegui colocar algumas classes dentro do index.php, mas eu não consegui criar uma classe que simulasse um formulário em HTML. Tentei fazer assim:

classe viewLogin { 
     private $viewLogin;
    public function __construct() {
          $this->viewLogin = "<form><input name=nome></form><?=$mensagem?>";}

e o PHP reclamou que a variável $mensagem não estava definida. Eu não tive outra escolha senão criar o arquivo viewLogin.php com o HTML correspondente.

Dentro do index.php eu não preciso mais usar o comando require_once ou include, eu já  vou direto na classe assim:

(new LoginController)->login();

E assim, consegui montar o meu segundo arquivo painel.php, ou seja, em menos de duas horas eu consegui o que eu não consegui em todo mês.

Mas na medida que o index.php foi expandindo, eu fiquei imaginando como evitar de escrever if(isset($_GET['key'])){...} para cada formulário que eu ia criando, eu queria a um GET para todos os formulários, inclusive um para o próprio index.php que não tem nenhum GET. Olha só como ficou bacana:

index.php

<?php
if($_GET==null){(new LoginController)->login();exit;}
switch(key($_GET)){
    case 'nome': (new LoginController)->verifica();break;
    case 'nomeTime': (new Times)->incluir();break;
    case 'alterarTime':
        (new Times)->alterar($id,$nome,$email,$senha,$telefone);break;
    case 'excluirTime' :(new Times)->excluir($id,$nome);break;}

class LoginController {
    public function login($mensagem=null,$nome=null) {
        $times=(new Times)->listaTimes();
        require_once 'viewLogin.php';}
    public function verifica(){
        $nome=$_GET['nome'];
        $senha=$_GET['senha'];
        if($nome==' NOVO CADASTRO'){
            require_once 'viewTimeCadastrar.php';exit;}
        if($senha!==(new Times)->senha($nome) || $senha=null){
            $times=(new Times)->listaTimes();
            $mensagem="Senha não bate!";
            require_once 'viewLogin.php';exit;}
        require_once 'viewPainel.php';}}

class Conexao {
    private $conexao;
    public function __construct(){
        $this->conexao=new mysqli("localhost","root","","u835212901_campbets");}
    public function consulta($sql) {
        $query=$this->conexao->query($sql);
        return $query->fetch_all(MYSQLI_ASSOC);}
    public function modifica($sql){
        return $this->conexao->query($sql);}
}


class Times {
    public function incluir(){
        $nome=$_GET['nomeTime'];
        $email=$_GET['email'];
        $senha=$_GET['senha'];
        $telefone=$_GET['telefone'];
        $sql="insert into times (nome,email,senha,telefone) values 
            ('$nome','$email','$senha','$telefone')";
        $fetch=(new Conexao)->modifica($sql);
        $mensagem="Cadastro do time $nome efetuado";
        require_once 'viewLogin.php';}
    public function listaTimes(){
        $fetch=(new Conexao)->consulta("select * from times order by nome");
        return json_decode(json_encode($fetch));}
    public function senha($nome){
        $fetch=(new Conexao)->consulta("select senha from times where nome='$nome'");
        return $fetch[0]['senha'];}
    public function excluir($id,$time){
        (new Conexao)->modifica("delete from times where id=$id");
        $mensagem="time $time retirado do banco de dados";
        require_once 'viewLogin.php';}
    public function alterar($id,$nome,$email,$senha,$telefone){
        (new Conexao)->modifica("update times set nome=$nome, email=$email, 
            senha=$senha,telefone=$telefone where id=$id");
        $mensagem="time $nome atualizado";
        require_once 'viewLogin.php';}
    }

class jogadores {
    public function incluir(){
        require_once 'viewCadastrarJogador.php';}
    public function alterar(){}
    public function excluir(){}
    }

É óbvio que isso é um péssimo exemplo de programação, mas foi assim que comecei a aprender a usar o PHP em 2020. Tudo na base da tentativa e erro.

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

1 resposta a esta questão

Posts Recomendados

  • 0

Não é uma boa ideia colocar todas as classes num só arquivo. O Lúcio sugeriu trabalhar com o endereço absoluto através dessa variável:

$path=$_SERVER['DOCUMENT_ROOT'].'/pastaDoProjeto/MVC';

Eu pensei fazer isso através do comando do PHP define, mas a constante desaparece toda vez que você submete um formulário.

A sugestão do Barder é de criar o arquivo config.php (onde é definido o path), ela é muito boa, se você precisar criar vários projetos com nomes diferentes. Não é o meu caso. Então decidi trabalhar com o endereço absoluto desde o index.php até cada uma das classes. Nas classes, eu fiz assim:

<?php
class LoginController {
    private $path;
    public function __construct(){
        $this->path=$_SERVER['DOCUMENT_ROOT'].'/campbets';}
    public function login($mensagem=null,$nome=null) {
        require_once "$this->path/Models/Times.php";
        $times=(new Times)->listaTimes();
        require_once "$this->path/Views/viewLogin.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,3k
×
×
  • Criar Novo...