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

[Dúvida] Problemas com a imagem

Boa tarde! Não consigo editar ou subir novas imagem, só consigo subir uma e exibir a mesma. Se eu tento editá-la, ou adicionar um novo vídeo com uma imagem diferente não funciona.

<?php

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) {
            header('Location: /?sucesso=0');
            return;
        }
        $titulo = filter_input(INPUT_POST, 'titulo');
        if ($titulo === false) {
            header('Location: /?sucesso=0');
            return;
        }

        $video = new Video($url, $titulo);
        // verifica o arquivo enviado e processa o upload
        if ($_FILES['image']['error'] === UPLOAD_ERR_OK) {
            // move o arquivo da pasta padrão para um local acessível.
            move_uploaded_file(
                $_FILES['image']['tmp_name'],
                __DIR__ . '/../../public/img/uploads/' . $_FILES['image']['name']
            );
            // processa o upload
            $video->setFilePath($_FILES['image']['name']);
        }

        $sucess = $this->videoRepository->add($video);
        if ($sucess === false) {
            header('Location: /?sucesso=0');
        } else {
            header('Location: /?sucesso=1');
        }
    }
}
<?php

require_once 'inicio-html.php'; ?>
            <main class="container">
                <form class="container__formulario" enctype="multipart/form-data" method="post">
                    <h2 class="formulario__titulo">Envie um vídeo!</h2>
                        <div class="formulario__campo">
                            <label class="campo__etiqueta" for="url">Link embed</label>
                            <input name="url" value="<?= $video?->url; ?>" class="campo__escrita" required
                                placeholder="Por exemplo: https://www.youtube.com/embed/FAY1K2aUg5g" id='url' />
                        </div>
                        <div class="formulario__campo">
                            <label class="campo__etiqueta" for="titulo">Titulo do vídeo</label>
                            <input name="titulo" value="<?= $video?->title; ?>" class="campo__escrita" required placeholder="Neste campo, dê o nome do vídeo"
                                id='titulo' />
                        </div>
                        <div class="formulario__campo">
                            <label class="campo__etiqueta" for="image">Imagem do vídeo</label>
                            <input name="image" accept="image/*" type="file" class="campo__escrita" id='image' />
                        </div>
                        <input class="formulario__botao" type="submit" value="Enviar" />
                </form>
            </main>
        <?php require_once '/fim-html.php';
<?php

namespace Alura\Mvc\Controller;

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

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

    }

    public function processaRequisicao(): void
    {
        $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
        if ($id === false || $id === null) {
            header('Location: /?sucesso=0');
            return;
        }

        $url = filter_input(INPUT_POST, 'url', FILTER_VALIDATE_URL);
        if ($url === false) {
            header('Location: /?sucesso');
            return;
        }

        $titulo = filter_input(INPUT_POST, 'titulo');
        if ($titulo === false) {
            header('Location: /?sucesso=0');
            return;
        }

        $video = new Video($url, $titulo);
        $video->setId($id);

        if ($_FILES['image']['error'] === UPLOAD_ERR_OK) {
            // move o arquivo da pasta padrão para um local acessível.
            move_uploaded_file(
                $_FILES['image']['tmp_name'],
                __DIR__ . '/../../public/img/uploads/' . $_FILES['image']['name']
            );
            // processa o upload
            $video->setFilePath($_FILES['image']['name']);
        }

        $sucesso = $this->videoRepository->update($video);
        if ($sucesso === false) {
            header('Location: /?sucesso=0');
        } else {
            header('Location: /?sucesso=1');
        }
    }
}

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

3 respostas
<?php

namespace Alura\Mvc\Repository;

use Alura\Mvc\Entity\Video;
use PDO;

class VideoRepository
{
    public function __construct(private PDO $pdo)
    {

    }

    public function add (Video $video): bool
    {
        $sql = 'INSERT INTO videos (url, title, image_path) VALUES (?, ?, ?)';
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1, $video->url);
        $statement->bindValue(2, $video->title);
        $statement->bindValue(3, $video->getFilePath());

        $result = $statement->execute();

        $id = $this->pdo->lastInsertId();
        $video->setId(intval($id));
        return $result;
    }

    public function remove (int $id): bool
    {
        $sql = 'DELETE FROM videos WHERE id = ?';
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1, $id);
        return $statement->execute();
    }

    public function update (Video $video): bool
    {
        $updateImageSql ='';
        if ($video->getFilePath() !== null) {
            $updateImageSql = ', image_path = :image_path';
        }
        $sql = "UPDATE videos SET 
            url = :url,
            title = :title
            $updateImageSql
        WHERE id = :id;";
        $statement = $this->pdo->prepare($sql);

        $statement->bindValue(':url', $video->url);
        $statement->bindValue(':title', $video->title);
        $statement->bindValue(':id', $video->id, PDO::PARAM_INT);
        if ($video->getFilePath() !== null){
            $statement->bindValue(':image_path', $video->getFilePath());
        }

        return $statement->execute();
    }

    /**
     * @return Video[]
     */
    public function all (): array
    {
        $videoList = $this->pdo
        ->query('SELECT * FROM videos;')
        ->fetchAll(PDO::FETCH_ASSOC);

        return array_map(
            $this->hydrateVideo(...),
            $videoList
        );
    }

    public function find(int $id) 
    {
        $statement = $this->pdo->prepare('SELECT * FROM videos WHERE id = ?;');
        $statement->bindValue(1, $id, PDO::PARAM_INT);
        $statement->execute();

        return $this->hydrateVideo($statement->fetch(PDO::FETCH_ASSOC));
    }

    private function hydrateVideo(array $videoData): Video
    {
        $video = new Video($videoData['url'], $videoData['title']);
        $video->setId($videoData['id']);

        if ($videoData['image_path'] !== null) {
            $video->setFilePath($videoData['image_path']);
        }

        return $video;
    }
}
<?php

namespace Alura\Mvc\Entity;

use InvalidArgumentException;

class Video 
{
    public readonly int $id;
    public readonly string $url;
    private ?string $filePath = null;

    public function __construct(string $url,
     public readonly string $title,)
    {
        $this->setUrl($url);
    }

    private function setUrl(string $url)
    {
        if (filter_var($url, FILTER_VALIDATE_URL) === false) {
            throw new InvalidArgumentException();
        }

        $this->url = $url;
    }

    public function setId (int $id): void
    {
        $this->id = $id;
    }

    public function setFilePath(string $filePath): void
    {
        $this->filePath = $filePath;
    }

    public function getFilePath(): ?string
    {
        return $this->filePath;
    }
}
<?php

require_once __DIR__ . '/inicio-html.php'; ?>
            <ul class="videos__container" alt="videos alura">
                <?php foreach ($videoList as $video): ?>
                    <li class="videos__item">
                        <?php if ($video->getFilePath() !== null): ?>
                        <a href="<?= $video->url; ?>">
                            <img src="/img/uploads/<?=$video->getFilePath(); ?>" alt="" style="width: 100%"/>
                        </a>
                        <?php else: ?>
                                <iframe width="100%" height="72%" src="<?= $video->url; ?>"
                                    title="YouTube video player" frameborder="0"
                                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
                                    allowfullscreen></iframe>
                        <?php endif; ?>
                            <div class="descricao-video">
                                <img src="./img/logo.png" alt="logo canal alura">
                                <h3><?= $video->title; ?></h3>
                                <div class="acoes-video">
                                <a href="/editar-video?id=<?= $video->id; ?>" class="btn btn-primary">Editar</a>
                                <a href="/remover-video?id=<?= $video->id; ?>" class="btn btn-danger">Excluir</a>
                            </div>
                        </div>
                    </li>
                <?php endforeach ?>
            </ul>
        <?php require_once __DIR__ . '/fim-html.php';
solução!

solucionei sozinho.