tarifhaus/doctrine-nullable-embeddable

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

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

This package is not auto-updated.

Last update: 2024-09-14 19:58:53 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' }