Chyba: Typed property must not be accessed before initialization

Při otevírání některých starých produktů v administraci se vyskytuje chyba:

Uncaught PHP Exception Error: "Typed property App\Entity\Product::$createdAt must not be accessed before initialization"

Chyba se objevila při pokusu o smazání produktu v admin/produkty/odstranit.html.twig na řádku 98.

Příčina

V entitě Product.php je property $createdAt definována jako typed property bez nullable:

#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private \DateTimeInterface $createdAt;

Důvody vzniku:

  1. V databázi mohou existovat historické produkty s hodnotou created_at = NULL
  2. V konstruktoru entity je sice inicializace $this->createdAt = new \DateTime(), ale Doctrine při načítání z DB nepoužívá konstruktor
  3. Doctrine používá reflection a nastavuje properties přímo z databázových hodnot
  4. Pokud je v DB hodnota NULL, property $createdAt zůstane neinicializovaná
  5. PHP 8.0+ vyžaduje, aby typed properties byly buď:
    • Inicializované (= null)
    • Nullable (?\DateTimeInterface)
    • Nebo nastavené v konstruktoru (což Doctrine nepoužívá)
Assignee Loading
Time tracking Loading