final-gene/doctrine-module

1.3.0 2016-02-10 12:26 UTC

This package is auto-updated.

Last update: 2024-09-10 22:11:26 UTC


README

本模块为 ZF2 doctrine 模块提供了一些有用的扩展。

安装

当 composer 可用于您的路径时,您就可以安装此模块了。

$ composer require final-gene/doctrine-module

然后,将 FinalGene\DoctrineModule 添加到您的应用程序配置文件中。

内容

实体管理器

背景

在 ZF2 中,我们这样检索实体管理器(以下示例来自一个工厂)

<?php
// ...
public function createService(ServiceLocatorInterface $serviceManager)
{
    // like this
    $entityManager = $serviceManager->get('Doctrine\\ORM\\EntityManager');
    // or that
    $entityManager = $serviceManager->get('doctrine.entitymanager.orm_default');
}

其缺点是,您必须知道配置的 manager/连接的名称。如果您处理多个连接或属于多模块项目,您将无法知道哪个连接或实体管理器属于您的实体。

使用方法

使用此模块后,上述代码变为以下内容

<?php
// ...
public function createService(ServiceLocatorInterface $serviceManager)
{
    $someEntityManager = $serviceManager->get('EntityManager')->get('SomeEntity');
}

现在您将获得一个根据加载的模块及其配置的实体管理器。

如果没有人为 DoctrineModule(或其中的 manager)进行配置,则会调用一个抽象工厂,它仅加载 doctrine 的默认实体管理器。

配置

请按照 DoctrineORMModule 文档 中描述的方式配置您的 doctrine 连接。

存储库管理器

背景

在 ZF2 中,我们这样检索我们的存储库(以下示例来自一个工厂)

<?php
public function createService(ServiceLocatorInterface $serviceManager)
{
    $entityManager = $serviceManager->get('Doctrine\\ORM\\EntityManager');
    $someRepository = $entityManager->getRepository('SomeEntity');
}

这有几个缺点

  1. 在运行时更改存储库很困难,因为您无法配置实体管理器/实体管理器 getRepository 方法的行为,因此您必须发明一个“代理”,然后在该代理中添加额外的逻辑以在您的不同存储库之间切换
  2. 难以测试:要使用替代存储库,您必须模拟强大实体管理器的 getRepository 函数
  3. 隐藏的依赖关系:我们不是从服务管理器请求依赖项,而是从实体管理器请求
  4. 无法轻松使用工厂类创建您的存储库

使用方法

使用此模块后,上述代码变为以下内容

<?php
// ...
public function createService(ServiceLocatorInterface $serviceManager)
{
    $someRepository = $serviceManager->get('RepositoryManager')->get('SomeEntity');
}

现在您将获得一个根据加载的模块及其存储库管理器配置的存储库。

如果没有人为 RepositoryManagerModule 进行配置,则会调用一个抽象工厂,它仅代理对 doctrine 实体管理器 getRepository 函数的请求。

配置

配置键

配置键是 repositories。子键与每个服务管理器(invokables、factories 等)中的相同。

示例

通过模块类的 getConfig

<?php
// ...
public function getConfig()
{
    return [
        'repositories' => [
            'factories' => [
                // your repository factories goes here
                // format: Entity-Name => Repository-Factory.
            ],
        ],
    ];
}

或通过 FinalGene\RepositoryManagerModule\ModuleManager\Feature\RepositoryProviderInterface(方法 getRepositoryConfig

<?php
// ...
public function getRepositoryConfig()
{
    return [
        'factories' => [
            // your repository factories goes here
        ],
    ];
}

或通过 config/autoload/repository-manager.global.config.php

return [
    'repositories' => [
        'factories' => [
            // your repository factories goes here
            // format: Entity-Name => Repository-Factory.
        ],
    ],
];

验证器

ObjectExists

此验证器将确定针对给定参数的对象是否存在。

配置

验证器可以像任何其他验证器一样使用和配置。您可以设置以下选项

  • entity_class:实体对象的 FQCN
  • find_method:在存储库中查找对象的函数
示例

在您的验证器配置中

[
    // ...
    [
        'name' => 'FinalGene\\DoctrineModule\\Validator\\ObjectExists',
        'options' => [
            'entity_class' => 'Your\\Doctrine\\Entity',
            'find_method' => 'find',
            'messageTemplates' => [
                'noObjectFound' => 'Entity with ID \'%value%\' not found',
            ],
        ],
    ],
];