Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Problema com rotas em action form PHP

Olá, minha dúvida é a seguinte, tenho meu projeto separado em pastas:

- controller/
    - ClienteController.php
- dao/
    - GenericDAO.php
- model/
    - Cliente.php

Meus arquivos na raiz:

- conexao.php
- clientes.php
- novo-cliente.php

Minha pagina de cadastrar novo cliente:

<?php
require_once('cabecalho.php');
require_once('dao/GenericDAO.php');
require_once('logica-empresa.php');

verificaEmpresa();

$cliente = array("nome" => "", "cnpj" => "", "telefone" => "", "email" => "", "celular" => "", "tipo_pessoa" => "0", "inscricao_estadual" => "");
$cliente[0]["imagem"] = "img/semFoto.svg";

?>
<div class="blocoTituloPagina">
  <h1>Novo Cliente</h1>
</div>
    <form action="controller/ClienteController.php" method="post" enctype="multipart/form-data"> 
        <div>
            <?php include("cliente-formulario-base.php"); ?>
            <div class="pBlocoButton">
              <a href="clientes.php" class="pButton">Voltar</a>
              <button class="pButton pButtonSalvar" type="submit">Cadastrar</button>
            </div>
        </div>
    </form>
<?php require_once('rodape.php'); ?>

Meu ClienteController.php

<?php
require_once 'model/Cliente.php';
require_once 'dao/GenericDAO.php';

class ClienteController {

    public function salvar() {
        $dao = new GenericDAO();
        // logica para salvar cliente no banco        
        if(isset($_POST['id'])) {
            $id = $_POST['id'];
        }
        $nome = $_POST["nome"];
        $cnpj = $_POST["cnpj"];
        $inscricaoEstadual = $_POST["inscricaoEstadual"];
        $telefone = $_POST["telefone"];
        $email = $_POST["email"];
        $celular = $_POST["celular"];
        $tipoPessoa = $_POST["tipoPessoa"];

        $caminhoImg = "img/empresas/empresa-{$_SESSION['empresa_id']}/clientes/";
        $imagem = uploadArquivo($caminhoImg);

        $cliente = new Cliente();
        $cliente->nome = $nome;
        $cliente->cnpj = $cnpj;
        $cliente->inscricao_estadual = $inscricaoEstadual;
        $cliente->telefone = $telefone;
        $cliente->email = $email;
        $cliente->celular = $celular;
        $cliente->tipo_pessoa = $tipoPessoa;
        $cliente->imagem = $imagem;

        $objCliente = $dao->inserir("clientes", $cliente);
    }

    public function atualizar() {
    // logica para atualizar cliente no banco
    }

    public function remover() {
    // logica para remover cliente do banco
    }

    public function listar() {
        $dao = new GenericDAO();
        // logica para listar toodos os clientes do banco
        $objListaClientes = $dao->listarAll("clientes");  

        $_REQUEST['clientes'] = $objListaClientes;

        require_once 'clientes.php';
    }
}
?>

Porém quando eu dou o submit para o meu controller/ClienteController.php ele me retorna este erro:

Warning: require_once(model/Cliente.php): failed to open stream: No such file or directory in C:\xampp\htdocs\SistemaVrau-OO\controller\ClienteController.php on line 2.

Como se ele não conseguisse achar o arquivo, por estar em uma pasta a frente. Gostaria de saber se tem como eu dar um require_once pela raiz, para ele não dar esses conflitos de pastas.

5 respostas

Oi Guilherme, tudo bom?

O require_once vai procurar os arquivos a partir do include path configurado no php.ini.

Verifica pra gente, qual é o caminho base do seu include executando a função:

var_dump(get_include_path());
die();

Assim, a gente consegue planejar melhor o caminho que a gente vai passar pra ele encontrar a pasta model =)

Abraço

solução!

Recomendo a criação de uma constante com o PATH absoluto da sua aplicação e em todos os require você atribui essa constante.

Arquivo de constant.php

O arquivo deve estar na raiz do projeto

<?php
define('ROOT_PATH',  __DIR__);
# ou se preferir...
define('ROOT_PATH', 'C:\xampp\htdocs\SistemaVrau-OO\');

Seu ClienteController.php

<?php
require_once ROOT_PATH . 'model/Cliente.php';
require_once ROOT_PATH . 'dao/GenericDAO.php';

class ClienteController {
    # ... seu código aqui...
}

Bom dia Cesar, eu criei o arquivo constant.php do jeito que sugeriu, porém quando vou dar o require_once dele nas paginas ocorre o erro de caminho dele.

Ocorre os seguintes erros:


Warning: require_once(constant.php): failed to open stream: No such file or directory in C:\xampp\htdocs\SistemaVrau-OO\controller\ClienteController.php on line 2

Fatal error: require_once(): Failed opening required 'constant.php' (include_path='C:\xampp\php\pear') in C:\xampp\htdocs\SistemaVrau-OO\controller\ClienteController.php on line 2

André, bom dia.

O var_dump(get_include_path());

Me retornou:
string(17) "C:\xampp\php\pear"

Oi Guilherme, parece que seu include path não ta apontando pra onde a gente esperava. Você pode usar a função set_include_path para testar e depois alterar no seu php.ini do xampp, pra ter algo mais reaproveitável =)