final-gene / doctrine-module
Doctrine 模块
Requires
- php: >=5.5.0
- doctrine/doctrine-orm-module: ^0.9.2
- zendframework/zend-config: ^2.5
- zendframework/zend-modulemanager: ^2.5
Requires (Dev)
- final-gene/phing-commons: ^2.2
- phpunit/phpunit: ^4.8
- zendframework/zend-filter: ^2.5
- zendframework/zend-form: ^2.5
- zendframework/zend-i18n: ^2.5
- zendframework/zend-inputfilter: ^2.5
- zendframework/zend-log: ^2.5
- zendframework/zend-serializer: ^2.5
- zendframework/zend-stdlib: ^2.5
- zendframework/zend-test: ^2.5
- zendframework/zend-validator: ^2.5
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'); }
这有几个缺点
- 在运行时更改存储库很困难,因为您无法配置实体管理器/实体管理器
getRepository
方法的行为,因此您必须发明一个“代理”,然后在该代理中添加额外的逻辑以在您的不同存储库之间切换 - 难以测试:要使用替代存储库,您必须模拟强大实体管理器的
getRepository
函数 - 隐藏的依赖关系:我们不是从服务管理器请求依赖项,而是从实体管理器请求
- 无法轻松使用工厂类创建您的存储库
使用方法
使用此模块后,上述代码变为以下内容
<?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
:实体对象的 FQCNfind_method
:在存储库中查找对象的函数
示例
在您的验证器配置中
[ // ... [ 'name' => 'FinalGene\\DoctrineModule\\Validator\\ObjectExists', 'options' => [ 'entity_class' => 'Your\\Doctrine\\Entity', 'find_method' => 'find', 'messageTemplates' => [ 'noObjectFound' => 'Entity with ID \'%value%\' not found', ], ], ], ];