20uf / 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-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
。
配置
为了正确运行此监听器,您必须完成两件事。
-
必须在属性映射中添加一个条目。这是通过调用
\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' }