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

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

Ashterix

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

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

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

Відомі помилки й обмеження поточної версії ufo-tech/doctrine-behaviors (2.0.0): симптом, причина й обхідний шлях. Виправлені — на сторінці Виправлені помилки.

<include>(.issues/default-connection-only.md)


<include>(.issues/tree-root-nodes.md)


<include>(.issues/translation-locale-length.md)


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

uk/docs/doctrine/doctrine-behaviors/known_issues/.issues/default-connection-only.md новий файл +24 −0

Поведінки працюють лише для з'єднання default

Актуальна

Зачеплені версії: 1.0.0 — 2.0.0 (поточна).

Симптом. У застосунку з кількома з'єднаннями Doctrine сутності менеджера, що працює через інше з'єднання, не отримують колонок поведінок і не заповнюються (createdAt, slug, translations тощо).

Причина. Усі слухачі в src/EventSubscriber/ зареєстровані атрибутом #[AsDoctrineListener(..., connection: 'default')], тож DoctrineBundle підключає їх лише до менеджера подій з'єднання default.

Обхідний шлях. Зареєструйте потрібні слухачі для свого з'єднання тегом doctrine.event_listener з autoconfigure: false (щоб атрибут не підключив копію ще й до default), напр.:

services:
    app.timestampable_reporting:
        class: Ufo\DoctrineBehaviors\EventSubscriber\TimestampableEventSubscriber
        autoconfigure: false
        arguments:
            $timestampableDateFieldType: '%doctrine_behaviors_timestampable_date_field_type%'
        tags:
            - { name: doctrine.event_listener, event: loadClassMetadata, connection: reporting, priority: 500 }

BlameableEventSubscriber і SluggableEventSubscriber (через DefaultSluggableRepository) отримують EntityManagerInterface у конструкторі — для них також передайте менеджер свого з'єднання (@doctrine.orm.reporting_entity_manager). Решта слухачів бере менеджер з аргументів події.

uk/docs/doctrine/doctrine-behaviors/known_issues/.issues/tree-root-nodes.md новий файл +11 −0

getRootNodes() не знаходить вузли, зроблені коренем через setChildNodeOf(null)

Актуальна

Зачеплені версії: 1.0.0 — 2.0.0 (поточна). Успадковано з KnpLabs/DoctrineBehaviors.

Симптом. Вузол, для якого викликали setChildNodeOf(null), isRootNode() вважає коренем, але TreeTrait::getRootNodes() його не повертає.

Причина. Новий вузол має materializedPath = '', а setChildNodeOf(null) записує '/'. getRootNodesQB() фільтрує лише materializedPath = ''.

Обхідний шлях. Не викликайте setChildNodeOf(null) для коренів або вибирайте корені власним запитом: ->andWhere("t.materializedPath IN ('', '/')").

uk/docs/doctrine/doctrine-behaviors/known_issues/.issues/translation-locale-length.md новий файл +30 −0

Колонка locale перекладу має довжину 5

Актуальна

Зачеплені версії: 1.0.0 — 2.0.0 (поточна). Успадковано з KnpLabs/DoctrineBehaviors.

Симптом. Переклад із локаллю довшою за 5 символів (sr_Latn, zh_Hant, de_CH_1996) не зберігається на СУБД, що перевіряють довжину рядка (MySQL у strict mode, PostgreSQL), — помилка «value too long» / «Data too long».

Причина. TranslatableEventSubscriber::mapTranslation() мапить locale як string з length: 5.

Обхідний шлях. Бандл не мапить locale, якщо поле вже змаплене. Підключіть у сутності перекладу TranslationMethodsTrait замість TranslationTrait і оголосіть властивості самі:

use Ufo\DoctrineBehaviors\Contract\Entity\TranslatableInterface;
use Ufo\DoctrineBehaviors\Contract\Entity\TranslationInterface;
use Ufo\DoctrineBehaviors\Model\Translatable\TranslationMethodsTrait;

#[ORM\Entity]
class CategoryTranslation implements TranslationInterface
{
    use TranslationMethodsTrait;

    #[ORM\Column(length: 16)]
    protected ?string $locale = null;

    protected ?TranslatableInterface $translatable = null;

    // ...
}

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

README і docs/ пакета застаріли

Актуальна

Зачеплені версії: 2.0.0 (поточна). Нестиковка документації, на роботу не впливає.

  • README.md указує PHP >= 8.2, DBAL ^3.2 | ^4.2, ORM ^3.3, DoctrineBundle ^2.6 — у 2.0.0 це PHP >= 8.4, DBAL ^4.2, ORM ^3.7, DoctrineBundle ^3.0.
  • У переліку поведінок README немає Sluggable і Loggable; Blameable описано як createdBy / updatedBy без deletedBy; Uuid — як «UUID як первинний ключ», хоча uuid — окрема колонка.
  • Розділ «Usage» посилається на документацію KnpLabs; CHANGELOG.md закінчується на 1.0.0.
  • Приклади в docs/*.md здебільшого на анотаціях @ORM\Entity, яких немає в Doctrine ORM 3; translatable.md посилається на неіснуючий github.com/Ufo/DoctrineBehaviors; tree.md не згадує, що для $root[0] потрібен ArrayAccess, а getTree() — з TreeTrait у репозиторії.

Актуальний опис — на цьому сайті.