Актуальні помилки Doctrine Helper

← Актуальні помилки Doctrine Helper

Ashterix

docs: Doctrine section with Doctrine Behaviors and Doctrine Helper (uk + en)

uk/docs/doctrine/doctrine-helper/known_issues/open.md новий файл +13 −0

Актуальні помилки Doctrine Helper

Відомі помилки й нестиковки поточної версії ufo-tech/doctrine-helper (1.1.0). Виправлені — на сторінці Виправлені помилки.

<include>(.issues/autoincrement-interface-mismatch.md)


<include>(.issues/enum-null-value.md)


<include>(.issues/readme-errors.md)

uk/docs/doctrine/doctrine-helper/known_issues/.issues/autoincrement-interface-mismatch.md новий файл +29 −0

AutoIncrementIdTrait несумісний з IHaveAutoincrementId

Актуальна

Зачеплені версії: 1.0.0 — 1.1.0 (поточна). Перевірено запуском на PHP 8.4.

Симптом. Клас, що реалізує IHaveAutoincrementId і використовує AutoIncrementIdTrait, не завантажується:

Fatal error: Declaration of App\Entity\Customer::getId(): ?int must be compatible with
Ufo\DoctrineHelper\Interfaces\IHaveAutoincrementId::getId(): int

Причина. AutoIncrementIdTrait::getId() повертає ?int (до flush() ідентифікатора немає), а інтерфейс вимагає int.

Обхідний шлях. Не реалізуйте інтерфейс або перевизначте метод у класі — метод класу має пріоритет над методом трейту:

#[ORM\Entity]
class Customer implements IHaveAutoincrementId
{
    use AutoIncrementIdTrait;

    public function getId(): int
    {
        return $this->id ?? throw new \LogicException('Customer is not persisted yet.');
    }
}

uk/docs/doctrine/doctrine-helper/known_issues/.issues/enum-null-value.md новий файл +11 −0

AbstractEnumType не приймає null

Актуальна

Зачеплені версії: 1.0.0 — 1.1.0 (поточна). Перевірено запуском на PHP 8.4 з DBAL 3.10; DBAL 4 так само передає null у тип.

Симптом. Запис null у колонку з типом на основі AbstractEnumType, навіть з nullable: true, завершується InvalidArgumentException: Invalid 'App\MyEnum' value. (на PHP 8.1+ перед цим — deprecation Passing null to parameter #1 ($value)).

Причина. DBAL викликає convertToDatabaseValue() і для null, а метод без перевірки передає значення в $enum::from(); будь-яка помилка перетворюється на InvalidArgumentException. Тип повернення string|int не дозволяє виправити це перевизначенням у підкласі.

Обхідний шлях. Для nullable-полів використовуйте замість цього типу вбудований мапінг enum Doctrine ORM — #[ORM\Column(type: 'string', enumType: MyEnum::class, nullable: true)] (колонка тоді VARCHAR, а не ENUM) — або окремий кейс enum на позначення відсутнього значення.

uk/docs/doctrine/doctrine-helper/known_issues/.issues/readme-errors.md новий файл +12 −0

Помилки в README пакета

Актуальна

Зачеплені версії: 1.0.0 — 1.1.0 (поточна). Перевірено за README.md і composer.json тегу 1.1.0.

  • У прикладі сутності changeCase() записує в неіснуючу властивість $this->type замість $this->case.
  • У прикладі MyEnumType немає use Ufo\DoctrineHelper\DBAL\AbstractEnumType;.
  • README описує лише AbstractEnumType; трейти, інтерфейси й Uuid не згадано.
  • Посилання homepage у composer.json і «Documentations» у README ведуть на docs.ufo-tech.space, а не на цей сайт.

Правильні приклади — на сторінках PHP enum як ENUM і Ідентифікатори сутностей.