Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Mensagem de erro para

Segui o passo a passo da aula, mas quando deixo de preencher o campo Título, ele não retorna o erro "Título não informado", ele apenas exibe um alerta no campo com "Preencha o campo".

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

Segue abaixo os códigos do programa:

Pedaço do código da view inicio-html.php:

<?php if (isset($_SESSION['error_message'])): ?>
    <h2 class="formulario__titulo erro">
        <?= $_SESSION['error_message']; ?>
        <?php unset($_SESSION['error_message']); ?>
    </h2>
<?php endif; ?>

Código do controller NewVideoController.php:

<?php

declare(strict_types=1);

namespace Alura\Mvc\Controller;

use Alura\Mvc\Entity\Video;
use Alura\Mvc\Repository\VideoRepository;

class NewVideoController implements Controller
{
    public function __construct(private VideoRepository $videoRepository)
    {
    }

    public function processaRequisicao(): void
    {
        $url = filter_input(INPUT_POST, 'url', FILTER_VALIDATE_URL);
        if ($url === false) {
            $_SESSION['error_message'] = "URL inválida.";
            header('Location: /novo-video');
            return;
        }
        $titulo = filter_input(INPUT_POST, 'titulo');
        if ($titulo === false) {
            $_SESSION['error_message'] = "Título não informado.";
            header('Location: /novo-video');
            return;
        }

        $video = new Video($url, $titulo);
        if ($_FILES['image']['error'] === UPLOAD_ERR_OK) {
            $safeFileName = uniqid('upload_') . '_' . pathinfo($_FILES['image']['name'], PATHINFO_BASENAME);

            // Verificar o tipo de arquivo usando uma biblioteca mais robusta
            $finfo = new \finfo(FILEINFO_MIME_TYPE);
            $mineType = $finfo->file($_FILES['image']['tmp_name']);

            if(str_starts_with($mineType, 'image/')){
                move_uploaded_file(
                    $_FILES['image']['tmp_name'],
                    __DIR__ . '/../../public/img/uploads/' . $safeFileName 
                );
                $video->setFilePath($safeFileName);
            }
        }

        $success = $this->videoRepository->add($video);
        if ($success === false) {
            $_SESSION['error_message'] = "Erro ao cadastrar vídeo.";
            header('Location: /novo-video');
        } else {
            header('Location: /?sucesso=1');
        }
    }
}
1 resposta
solução!

Oii, Renata!

Isso ocorre devido ao atributo "required" presente na tag input do HTML. Esse atributo torna obrigatório que o usuário preencha aquele campo.

Se você remover o "required" conforme mostrado abaixo, provavelmente a mensagem da flash message vai aparecer:

Arquivo: video-form.php

            <input name="titulo"
                   value="<?= $video?->title; ?>"
                   class="campo__escrita"
                  ** required**  // remova
                   placeholder="Neste campo, dê o nome do vídeo"
                   id='titulo' />

Você pode questionar: se o atributo já existe, por que validar no backend? A validação no backend é necessária porque nem todas as requisições vêm do formulário HTML e, além disso, um usuário pode manipular o código-fonte através da inspeção de elementos e remover o atributo "required".

Espero ter ajudado. Bons estudos :)