tarifhaus / doctrine-nullable-embeddable
Doctrine 实体中 nullable embeddables 的解决方案。
Requires
- php: ^7.0
- symfony/property-access: ^3.2|^4.0
Requires (Dev)
- phpunit/phpunit: ^5.7
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
。
配置
为了使此监听器正确运行,您必须执行以下两件事。
-
必须创建一个属性映射条目。这通过调用
\Tarifhaus\Doctrine\ORM\NullableEmbeddableListener::addMapping
实现。它接收实体的完全限定类名 (FQCN) 和 embeddable 所在属性的名称。例如
<?php use Tarifhaus\Doctrine\ORM\NullableEmbeddableListenerFactory; $listener = NullableEmbeddableListenerFactory::createWithClosureNullator(); $listener->addMapping('App\Domain\User\Model\UserProfile', 'address');
-
现在监听器需要与 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' }