11
respostas

Utilizar jQuery no curso mvc php

No tópico sobre traits do curso mvc php são exibidas flash messages no header/início do projeto. Quero usar jQuery para esconder essas mensagens após um período, mas não consigo incluir o jQuery no projeto. Qual local correto para chamar esses arquivos de front? Tentei colocar na pasta públic e chamar os arquivos na view header/início, que é onde as mensagens são exibidas. Os arquivos não são localizados não sei por quê?

11 respostas

Olá, Jamil.

Você fez certinho, aparentemente. Colocar na pasta public e chamar pelo header.

Só que nosso aquivo de rotas não está preparado para fazer requisições para arquivos reais (que não passem pelo `index.php).

Solução mais rápida: Se estiver utilizando o servidor embutido do PHP, adicione no seu arquivo seu arquivo public/index.php, logo abaixo da definição da variáveo $path:

if (file_exists($path) {
    return false;
}

Isso indica para o servidor embutido do PHP que deve acessar diretamente o arquivo, e não passar pelo arquivo de rotas.

Desculpe minha ignorância, mas não entendi como implementar isso. No meu front controller(index.php) eu faço essa verificação na variável $path. Eu tenho que criar essa variável? Devo atribuir algo a ela?

Fala, Jamil. Me passa o conteúdo do seu arquivo index.php no momento em que você está. Ele é alterado durante o curso, então não sei em que ponto você está.

Só me manda o seu index.php que consigo te ajudar melhor.

<?php
require __DIR__.'/../vendor/autoload.php';

use Alura\Cursos\Controller\InterfaceControladorRequisicao;


$caminho = $_SERVER['PATH_INFO']; 
$rotas = require __DIR__ . '/../config/routes.php'; 


if(!array_key_exists($caminho, $rotas)) {
    $controlador = new Erro();
    $controlador->processaRequisicao();
    //http_response_code(404);
    exit();
}

session_start();

/
$eRotaLogin = stripos($caminho, 'login');

if(!isset($_SESSION['logado']) && $eRotaLogin === false){
    header('Location: /login');
    exit();
}

$classeControladora = $rotas[$caminho];
/** @var InterfaceControladorRequisicao $controlador */
$controlador = new $classeControladora();
$controlador->processaRequisicao();
...
$caminho = $_SERVER['PATH_INFO']; 
if (file_exists($caminho) {
    return false;
}
...

Não deu certo Vinicius. Toda aplicação que trabalha com rotas no back end traz este problema? É normal quando se trabalha com esta arquitetura? No console da erro 404 - não localiza o arquivo. A inclusão dos arquivos js esta sendo feita no header.php. É o local onde quero manipular as mensagens exibidas no DOM. Segue arquivo header.php :

"

Home
    <ul class="navbar-nav ml-auto">
        <li class="nav-item active">
            <a class="nav-link" href="/logout">Sair</a>
        </li>
    </ul>
</nav>

<?php if (isset($_SESSION['mensagem'])): ?>
    <div class="alert alert-<?= $_SESSION['tipo_mensagem']; ?>" id="mensagem">
        <?= $_SESSION['mensagem']; ?>

    </div>

<?php
    unset($_SESSION['mensagem']);
    unset($_SESSION['tipo_mensagem']);
endif;
?>
<script src="js/jquery.js"></script>
<script src="js/main.js"></script>

"

Fala, Jamil.

Normalmente nós temos um servidor web configurado que vai mandar as URLs para onde deveriam ir. Neste curso estamos utilizando o php -S, então não precisamos de nenhuma configuração. Basta retornar false quando for para o servidor do PHP não realizar a interpretação das rotas, entende?

Você está utilizando Windows? Se sim, provavelmente essa modificação no código que te enviei deve resolver:

...
$caminho = $_SERVER['PATH_INFO']; 
if (file_exists(__DIR__ . '/' . $caminho) {
    return false;
}
...

Inclui exatamente este código mas ele não localiza os arquivos js. Exibe este erro: "GET http://localhost:8080/js/jquery.js net::ERR_ABORTED 404 listar-cursos:25 (Not Found)"

Este o index.php:

"<?php require DIR.'/../vendor/autoload.php';

use Alura\Cursos\Controller\InterfaceControladorRequisicao;

$caminho = $SERVER['PATHINFO']; if (file_exists(DIR . '/' . $caminho)){ return false; } $rotas = require DIR . '/../config/routes.php';

if(!array_key_exists($caminho, $rotas)) { $controlador = new Erro(); $controlador->processaRequisicao();

exit();

}

session_start();

$eRotaLogin = stripos($caminho, 'login');

if(!isset($_SESSION['logado']) && $eRotaLogin === false){ header('Location: /login'); exit(); }

$classeControladora = $rotas[$caminho]; /** @var InterfaceControladorRequisicao $controlador */ $controlador = new $classeControladora(); $controlador->processaRequisicao(); "

Coloca o public no caminho do arquivo.

<script src="public/js/jquery.js"></script>

Realmente não carrega o recurso. Só faz o carregamento do que está definido nas rotas. Deve ter alguma forma de carregar esses arquivos até porque, se eu for desenvolver algum sistema provavelmente vou ter que manipular no front.

Jamil, você tá utilizando Windows?

Tá utilizando o servidor embutido do PHP?

Porque eu fiz o testes aqui na minha máquina e nem ao menos o return false eu precisei adicionar.

Criei o arquivo public/js/teste.js e nele coloquei um console.log. No meu html eu só adicionei <script src="js/teste.js"></script>

Funciona sem nenhuma configuração extra.