dcwq / api-tools-doctrine-hydration-module

v4.1.3 2021-01-18 20:48 UTC

This package is not auto-updated.

Last update: 2024-09-30 13:27:39 UTC


README

Build status Packagist Downloads

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"