Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Lista de exercícios

Proposta:
Praticar é muito importante! Por isso, preparamos um exercício para você exercitar o conteúdo abordado nesta aula. No arquivo que possui a mensagem de sucesso após exportar o arquivo, leia o arquivo exportado e exiba todas as informações do filme.

Resolução do instrutor: 

<?php

$conteudoArquivoJson = file_get_contents('filme.json');
$filme = json_decode($conteudoArquivoJson, true);

?>
<!DOCTYPE html>
<html>
<head>
    <title>Filme inserido</title>
</head>
<body>
    <h1><?= $filme['nome']; ?></h1>
    <dl>
        <dt>Ano de lançamento</dt>
        <dd><?= $filme['anoLancamento']; ?></dd>

        <dt>Nota</dt>
        <dd><?= $filme['nota']; ?></dd>

        <dt>Gênero</dt>
        <dd><?= $filme['genero']; ?></dd>
    </dl>
</body>
</html>

Boa noite! Tentei inovar, mas sei se deu muito certo hahaha.

No arquivo, funcoes.php, criei a função "getsFilme":

function getsFilme(string $nomeFilmeDesejado) {
    $contentJson = file_get_contents(__DIR__ . '/../filme.json');
    $contentJsonConverted = json_decode($contentJson, true);

    if (isset($contentJsonConverted['nome']) && $contentJsonConverted['nome'] === $nomeFilmeDesejado) {
        return $contentJsonConverted;
    }
    // Aqui deu bom pq tem só um filme no Json, se precisar de mais precisa mudar a implementação
}

Fiz a inclusão desse arquivo utilizando o include_once:

<?php
include_once(__DIR__ . '/../src/funcoes.php');
$filme = getsFilme($_GET['filme']);
?>

O meu argumento inicial era:

Vou remover as informações brutas do .json e as responsabilidades de tratar ele para um local mais seguro ao invés do sucesso.php, que está sendo tratado em uma pasta "public";

Porém, não sei se isso de fato tiraria a visibilidade do .json de uma pessoa maliciosa com os devidos conhecimentos técnicos. Outra coisa que percebi também é a lentidão enorme(UNS 4 segundos, mas para a web acho que é lento, ainda mais com 1 requisição kkkk) em toda vez que cadastrado um novo filme até que seja mostrada a tela de sucesso.

Como ficou ao final a estrutura:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oi, Eliel. Tudo bem com você?

Sua proposta de tirar do sucesso.php a responsabilidade de acessar e tratar diretamente o JSON é uma boa forma de aplicar a organização de código. A função getsFilme() também deixa essa responsabilidade centralizada, e você ainda deixou registrado no comentário um ponto importante: a implementação atual considera que existe apenas um filme no JSON. Como exercício, a solução funciona para esse cenário, mas existe uma inconsistência importante no uso do $_GET['filme']: como esse valor vem diretamente da URL, vale considerar a possibilidade de a chave não existir. Um acesso como $_GET['filme'] ?? '' evitaria um aviso caso a página seja acessada sem esse parâmetro.

Sobre a segurança, mover o processamento para funcoes.php não impede, sozinho, que alguém acesse filme.json diretamente. O que realmente protege o arquivo é mantê-lo fora do diretório público do servidor ou configurar o servidor para impedir o acesso direto a ele. Assim, o PHP consegue ler o arquivo, mas uma pessoa não consegue simplesmente abrir /filme.json pelo navegador. Já os 4 segundos merecem investigação, porque file_get_contents() e json_decode() para um arquivo pequeno normalmente não deveriam representar uma demora tão grande. Pode ser interessante medir em qual parte do processo esse tempo está sendo gasto.

Continue experimentando essas melhorias, pois esse tipo de questionamento ajuda bastante a desenvolver uma visão mais próxima de projetos reais. O fórum está à disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!