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

[Dúvida] Video::$id must not be accessed before initialization

Opa. Meu projeto depois das alterações das aulas da seção 3 está quebrando ao usar alguns métodos do VideoRepository:

[Fri Jan 27 12:10:07 2023] 127.0.0.1:40064 [500]: POST /editar-video?id=13 - Uncaught Error: Typed property Alura\Mvc\Entity\Video::$id must not be accessed before initialization in ~/Programming/PHP/aluraplay/src/Repository/VideoRepository.php:77

Nessa chamada em específico: $statement->bindValue(':id', $video->id, PDO::PARAM_INT);

Entity:

<?php

namespace Alura\Mvc\Entity;

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

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

  private function setUrl(string $url): void
  {
    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;
  }
}

Está do mesmo jeito que os repositórios do curso. Qual seria o erro?

3 respostas

Pela mensagem de erro "Uncaught Error: Typed property Alura\Mvc\Entity\Video::$id must not be accessed before initialization", percebo que você está tentando usar o objeto VIDEO antes de criá-lo.

Você criou o objeto com NEW antes desta linha $statement->bindValue(':id', $video->id, PDO::PARAM_INT); ?

O objeto Video é passado como parâmetro na função:

  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();
  }

Na linha 51 do EditVideoController ele é instanciado:

$video = new Video($url, $title);

E na linha 70 ele é passado como argumento:

$success = $this->videoRepository->update($video);
solução!

Esquece. Descobri que faltava só essa linha depois da instanciação da classe Video:

$video->setId($id);

Setar o id para a classe. Meh. Muito obrigado, Gabriel!