phpro / zf-doctrine-hydration-module
Doctrine hydrators for ZF2 and ZF3
Requires
- php: ^5.6 || ^7.0
- doctrine/common: ^2.6.1
- doctrine/doctrine-module: ^1.2 || ^2.1.7
- doctrine/instantiator: ^1.0.5
- zendframework/zend-hydrator: ^1.1 || ^2.2.1
- zendframework/zend-modulemanager: ^2.7.2
- zendframework/zend-servicemanager: ^3.3.2
Requires (Dev)
- doctrine/doctrine-mongo-odm-module: ^0.11 || ^1.0
- doctrine/doctrine-orm-module: ^1.1 || ^2.1.2
- doctrine/mongodb-odm: ^1.1
- fabpot/php-cs-fixer: ^1.11.6
- phpro/grumphp: ^0.9.1
- phpunit/phpunit: ^5.7.27
README
仓库已废弃
PHPro 已不再使用 Apigility。因此,我们难以为此包做出正确的决策。我们正在寻找愿意接管此包并能够将其引导到正确方向的人。
你就是这样的人吗?联系我们,我们将讨论如何互相帮助!
请随意使用,我们将不再提供任何支持。
Doctrine Hydration Module
此模块提供了一种可配置的方式创建新的 doctrine hydrators。通过使用可配置的 API,可以轻松创建适用于任何用例的自定义 hydrator。
对于 ORM,使用 doctrine 模块的基本 hydrator。可以配置自己的策略来处理像引用实体这样的复杂对象。
对于 MongoDB ODM,添加了特定的 hydrator。此 hydrator 将能够处理引用文档和嵌入式文档。还可以使用鉴别器映射表对高级文档进行 hydration。
支持的功能
- 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
此属性用于指定将要进行 hydration 的实体的类。您需要确保此实体是映射的 doctrine 类。
object_manager
您可以指定要用于 hydrator 的对象管理器。值是服务管理器中所需对象管理器的键。
by_value
指定是否希望 hydrator 通过值或通过引用来 hydration 实体。
use_generated_hydrator
此属性仅在 MongoDB ODM 中使用,并将使用生成的 hydrator 而不是 Doctrine 模块 hydrator。当此选项设置为 true
时,策略将不起作用。
naming_strategy
您可以为 hydrator 使用自定义命名策略。指定服务管理器中命名策略的键。请注意,此命名策略需要实现 NamingStrategyInterface
。
hydrator
您可以使用自定义 hydrator 而不是默认的 DoctrineObject
hydrator。确保此 hydrator 实现 HydratorInterface
。
strategies
您可以自定义特定属性的 hydration 策略。使用服务管理器中的策略键配置要自定义的属性;请注意,此策略需要实现 StrategyInterface
。
filters
此属性可以用于在 hydrator 上应用过滤器。您可以通过定义服务管理器中过滤器的键和过滤器条件(如 hydrator 过滤器文档中所述)来指定自定义过滤器列表。请注意,此过滤器需要实现 FilterInterface
。
从现在开始,您可以通过在 HydratorManager 上调用 get('hydrator-manager-key')
来获取 hydrator。
自定义策略
MongoDB ODM
- DateTimeField: 用于 DateTime 对象
- DefaultRelation: 保持关系不变。不对字段进行任何修改。
- 嵌入式集合:用于嵌入式集合
- 嵌入式字段:用于嵌入式字段
- 引用集合:用于引用集合
- 引用字段:用于引用字段。
- 嵌入式引用集合:这是一种可以用于API中显示引用对象所有字段的自定义策略。加湿功能与常规引用对象相同。
- 嵌入式引用字段:这是一种可以用于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
并将其作为过滤器注入到加湿器中。该过滤器必须实现Zend\Hydrator\Filter\FilterInterface
。
服务中的filter($fieldName)
函数将在extract
期间由加湿器调用,并将正在提取的字段名作为参数传递。filter()
函数必须返回一个真值:如果返回true
,则该字段将不会提取。
覆盖加湿器
如果标准DoctrineHydrator不够灵活,您可以设置自定义的hydrator
。这允许您使用扩展的DoctrineHydrator或其他现有加湿器,并通过此模块对其进行配置。此设置将覆盖use_generated_hydrator
。
return array( 'doctrine-hydrator' => array( 'custom-hydrator' => array( // other config 'hydrator' => 'Zend\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"