dcwq / api-tools-doctrine-hydration-module
Requires
- php: ^5.6 || ^7.0
- doctrine/common: ^2.6.1
- doctrine/doctrine-module: ^4.1
- doctrine/instantiator: ^1.0.5
- laminas/laminas-dependency-plugin: ^1.0
- laminas/laminas-hydrator: ^1.1 || ^2.1 || ^3.0 || ^4.0
- laminas/laminas-modulemanager: ^2.7.2
- laminas/laminas-servicemanager: ^3.3.2
Requires (Dev)
- doctrine/doctrine-mongo-odm-module: ^0.11 || ^1.0
- doctrine/doctrine-orm-module: ^1.1 || ^2.1.2 || ^3.0
- doctrine/mongodb-odm: ^1.1
- fabpot/php-cs-fixer: ^1.11.6
- phpro/grumphp: ^0.9.1
- phpunit/phpunit: ^5.7.27
README
Doctrine Hydration Module
此模块提供了一种可配置的方式来创建新的Doctrine hydrators。通过使用可配置的API,可以轻松地为任何用例创建自定义hydrator。
对于ORM,正在使用来自doctrine模块的基本hydrator。可以为像引用实体这样的复杂对象配置自己的策略。
对于MongoDB ODM,添加了特定的hydrator。此hydrator将能够处理引用文档和嵌入式文档。还可以使用区分器映射来填充高级文档。
支持的功能
- 4.0.x: 包含zend-servicemanager >=3.3.2支持,需要PHP 5.6+。
- 3.0.x: 包含zend-servicemanager >=3支持,需要PHP 5.6+。
- 2.0.x: 包含zend-hydrator支持,需要PHP 5.6+。
- 1.0.x: 包含zend-stdlib <2.7支持,需要PHP 5.4+。
如果您想将更改合并到项目中,请确保在正确的分支上进行提交。
安装
添加到composer.json
composer require phpro/zf-doctrine-hydration-module
添加到应用配置
return array( 'modules' => array( 'Phpro\\DoctrineHydrationModule', // other libs... ), // Other config );
hydrator配置
return array( 'doctrine-hydrator' => array( 'hydrator-manager-key' => array( 'entity_class' => 'App\Entity\EntityClass', 'object_manager' => 'doctrine.objectmanager.key.in.servicelocator', 'by_value' => true, 'use_generated_hydrator' => true, 'naming_strategy' => 'custom.naming.strategy.key.in.servicemanager', 'hydrator' => 'custom.hydrator.key.in.hydratormanager', 'strategies' => array( 'fieldname' => 'custom.strategy.key.in.servicemanager', ), 'filters' => array( 'custom_filter_name' => array( 'condition' => 'and', // optional, default is 'or' 'filter' => 'custom.hydrator.filter.key.in.servicemanager', ), ), ), ), );
entity_class
此属性用于指定将被填充的实体的类。您需要确保此实体是一个已映射的doctrine类。
object_manager
您可以指定要用于hydrator的对象管理器。该值是服务管理器中所需对象管理器的键。
by_value
指定是否要按值或按引用填充实体。
use_generated_hydrator
此属性仅在MongoDB ODM中使用,并将使用生成的hydrators而不是Doctrine模块hydrator。当此选项设置为true
时,策略将不起作用。
naming_strategy
您可以为hydrator使用自定义命名策略。指定服务管理器中命名策略的键。请注意,此命名策略需要实现NamingStrategyInterface
。
hydrator
您可以使用自定义hydrator来替代默认的DoctrineObject
hydrator。确保此hydrator实现了HydratorInterface
。
strategies
可以自定义特定属性的填充策略。使用服务管理器中的策略键配置您要自定义的属性;请注意,此策略需要实现StrategyInterface
。
filters
此属性可用于在hydrator上应用过滤器。您可以通过定义服务管理器中的过滤器键和过滤器条件(如hydrator过滤器文档中所述)来指定自定义过滤器列表。请注意,此过滤器需要实现FilterInterface
。
从现在起,您可以通过在HydratorManager上调用get('hydrator-manager-key')
来获取hydrator。
自定义策略
MongoDB ODM
- DateTimeField:用于DateTime对象
- DefaultRelation:保留关系不变。不对字段进行任何修改。
- EmbeddedCollection:用于嵌入式集合
- EmbeddedField:用于嵌入式字段
- ReferencedCollection:用于引用集合
- ReferencedField:用于引用字段。
- EmbeddedReferenceCollection:这是一个自定义策略,可以在API中使用,以显示引用对象中的所有字段。填充工作与常规引用对象相同。
- EmbeddedReferenceField:这是一个自定义策略,可以在API中使用,以显示引用对象中的所有字段。填充工作与常规引用对象相同。
自定义过滤器
自定义过滤器允许您通过确定应提取哪些字段来微调水合器extract
功能的输出结果。
配置自定义过滤器
return array( 'doctrine-hydrator' => array( 'custom-hydrator' => array( // other config 'filters' => array( 'custom.filter.name' => array( 'condition' => 'and', //optional, default: FilterComposite::CONDITION_OR, 'filter' => 'custom.filter', // a name in the Service Manager ), ), ), ), );
在此示例配置中,水合器工厂将从服务管理器中检索custom.filter
并将其作为过滤器注入到水合器中。该过滤器必须实现Laminas\Hydrator\Filter\FilterInterface
接口。
服务中的filter($fieldName)
函数将在水合器执行extract
时被调用,并且正在提取的字段名称将作为参数传递。该filter()
函数必须返回一个真值:如果返回true
,则该字段将不会被提取。
覆盖水合器
如果标准的DoctrineHydrator不够灵活,您可以设置一个自定义的水合器。这允许您使用扩展的DoctrineHydrator或另一个现有的水合器,并通过此模块对其进行配置。此设置将覆盖use_generated_hydrator
。
return array( 'doctrine-hydrator' => array( 'custom-hydrator' => array( // other config 'hydrator' => 'Laminas\Hydrator\ArraySerializable' ), ), );
测试
此软件包已完全通过Cs fixer和PhpUnit进行测试。MongoDB测试需要在您的机器上安装mongodb。您可以通过在命令中添加testsuite来跳过这些测试。
# Php coding standards: # (The files are loaded according to the PSR-4 standard. The PSR-0 fix will fail!) ./vendor/bin/php-cs-fixer fix . --dry-run --fixers=-psr0 # Phpunit: ./vendor/bin/phpunit # Testing one testsuite: ./vendor/bin/phpunit --testsuite="Main" ./vendor/bin/phpunit --testsuite="ODM"