20uf/doctrine-nullable-embeddable

Doctrine 实体中 nullable embeddables 的解决方案实现。

该包的官方仓库似乎已消失,因此该包已被冻结。

v2.0.0 2018-05-19 09:57 UTC

This package is not auto-updated.

Last update: 2024-02-24 01:13:12 UTC


README

此监听器使您可以为您的 Doctrine embeddables 设置真正的 null 值。监听器通过 postLoad 生命周期回调 与之连接,并替换为 null 的 embeddable 值。

实现了针对此开放问题的解决方案

此监听器依赖于一个 evaluator 来检查是否指示 nullator 将 embeddable 替换为 null。此辅助库包含不同的实现和相应的接口,以便您自行构建。

默认的 evaluator 要求 embeddable 类实现 Tarifhaus\Doctrine\ORM\NullableEmbeddableInterface。它包含一个方法 isNull(): bool,该方法告诉评估器,是否应该将加载的 embeddable 视为 null 并替换为 null

nullator 实际上以特定的方式替换 embeddable 为 null

配置

为了正确运行此监听器,您必须完成两件事。

  1. 必须在属性映射中添加一个条目。这是通过调用 \Tarifhaus\Doctrine\ORM\NullableEmbeddableListener::addMapping 来完成的。它接收实体的 FQCN(完全限定类名)和 embeddable 所在属性的名称。

    例如

    <?php
    
    use Tarifhaus\Doctrine\ORM\NullableEmbeddableListenerFactory;
    
    $listener = NullableEmbeddableListenerFactory::createWithClosureNullator();
    $listener->addMapping('App\Domain\User\Model\UserProfile', 'address');
  2. 现在,监听器需要与 Doctrine EventManager 注册。

    <?php
    
    use Doctrine\Common\EventManager;
    use Doctrine\ORM\Events;
    use Tarifhaus\Doctrine\ORM\NullableEmbeddableListenerFactory;
    
    $listener = NullableEmbeddableListenerFactory::createWithClosureNullator();
    $listener->addMapping('App\Domain\User\Model\UserProfile', 'address');
    
    $evm = new EventManager();
    $evm->addEventListener([Events::postLoad], $listener);

提示:当配置监听器时,强烈建议使用 Doctrine 实体监听器,以便它仅对其应用的实体执行。

Symfony

如果您使用 Symfony 与 Doctrine,则可以将监听器注册为服务。

services:
    tarifhaus.doctrine.nullable_embeddable.property_accessor:
        public: false
        class: Tarifhaus\Doctrine\ORM\NullableEmbeddable\PropertyAccessor
        arguments:
            - '@property_accessor'

    tarifhaus.doctrine.nullable_embeddable_closure_nullator:
        public: false
        class: Tarifhaus\Doctrine\ORM\NullableEmbeddable\ClosureNullator

    tarifhaus.doctrine.nullable_embeddable_listener:
        public: false
        class: Tarifhaus\Doctrine\ORM\NullableEmbeddableListener
        arguments:
            - '@tarifhaus.doctrine.nullable_embeddable.property_accessor'
            - '@tarifhaus.doctrine.nullable_embeddable_closure_nullator'
        calls:
            - ['addMapping', ['App\Domain\User\Model\UserProfile', 'address']]
        tags:
            - { name: 'doctrine.orm.entity_listener', entity: '\App\Domain\User\Model\UserProfile', event: 'postLoad' }