Актуальні помилки Doctrine Helper
Відомі помилки й нестиковки поточної версії ufo-tech/doctrine-helper (1.1.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.');
}
}
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 на позначення відсутнього значення.
Помилки в 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 і Ідентифікатори сутностей.