荷兰桥 / doctrine-extensions
Requires
- doctrine/orm: *
This package is not auto-updated.
Last update: 2024-09-24 04:40:28 UTC
README
此软件包包含对 Doctrine 2 的几个扩展,它们钩入 Doctrine 的功能,提供新的功能或工具,以更有效地使用 Doctrine 2。
包括 DoctrineExtensions
要包含 DoctrineExtensions,需要启动自动加载器,例如
<?php $classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions', "/path/to/extensions"); $classLoader->register();
分页器
分页器提供了一种强大的方式来遍历任何 DQL,甚至可以检索集合的联接。为此,它必须向数据库发出 3 个查询
- 计算列表中的条目总数
- 检索给定 $limit + $offset 窗口的唯一 ID
- 检索 2 中给出的所有唯一 ID 的实体
如果您不需要遍历一个检索到的联接到的多对一 DQL 查询,则可以简化
- 计算列表中的条目总数
- 使用 $query->setFirstResult($offset)->setMaxResults($limit); 检索查询
分页器的 API 真的很简单
<?php use DoctrineExtensions\Paginate\Paginate; $query = $em->createQuery($dql); $count = Paginate::getTotalQueryResults($query); // Step 1 $paginateQuery = Paginate::getPaginateQuery($query, $offset, $limitPerPage); // Step 2 and 3 $result = $paginateQuery->getResult();
在简单情况下,它甚至更简单
<?php $count = Paginate::getTotalQueryResults($query); // Step 1 $result = $query->setFirstResult($offset)->setMaxResults($limitPerPage)->getResult(); // Step 2
这些方法内部使用其他几个方法来创建和检索数据。您可以使用这些方法与现有的分页解决方案集成,已经提供了一份 Zend_Paginator
实现(DoctrineExtensions\Paginate\PaginationAdapter
)。
PHPUnit
Doctrine 的 PHPUnit 扩展提供了对 PHPUnit 数据库扩展的几个钩子,并为测试 Doctrine 2 代码提供了一种非常方便的方式,使其与数据库进行交互。
使用 OrmTestCase
示例
<?php namespace MyProject\Tests; use DoctrineExtensions\PHPUnit\OrmTestCase class EntityFunctionalTest extends OrmTestCase { protected function createEntityManager() { return Doctrine\ORM\EntityManager::create(..); } protected function getDataSet() { return $this->createFlatXmlDataSet(__DIR__."/_files/entityFixture.xml"); } }
有关更多信息,请参阅 PHPUnit 文档中有关此主题的内容:http://www.phpunit.de/manual/current/en/database.html
注意事项
此 PHPUnit 扩展不会为您创建数据库模式。您必须在运行测试之前创建它。如果您想动态创建模式,您必须监听 'preTestSetUp' 和 'postTestSetUp' 事件,这些事件分别在加载测试用例之前和之后调用。
<?php namespace MyProject\Tests; use DoctrineExtensions\PHPUnit\Event\EntityManagerEventArgs, DoctrineExtensions\PHPUnit\OrmTestCase, Doctrine\ORM\Tools\SchemaTool, Doctrine\ORM\EntityManager; class SchemaSetupListener { public function preTestSetUp(EntityManagerEventArgs $eventArgs) { $em = $eventArgs->getEntityManager(); $schemaTool = new SchemaTool($em); $cmf = $em->getMetadataFactory(); $classes = $cmf->getAllMetadata(); $schemaTool->dropDatabase(); $schemaTool->createSchema($classes); } } class EntityFunctionalTest extends OrmTestCase { protected function createEntityManager() { $eventManager = new EventManager(); $eventManager->addEventListener(array("preTestSetUp"), new SchemaSetupListener()); return Doctrine\ORM\EntityManager::create(.., $eventManager); } }
待办事项
- 为 DataSet 和 DataTable 接口添加一个过滤器,以在实体和数据库列之间进行转换。这也可以用作“测试用例”管理的基础。可以使用 XML 或 YAML 测试用例格式来填充数据库。
- 添加一个测试用例,该测试用例将自动测试所有实体的持久性,包括相关实体,与当前的映射模式和数据库。
可版本化
已弃用,请使用 https://github.com/simplethings/EntityAudit
简介
可版本化允许您通过 DoctrineExtensions\Versionable\Versionable
接口标记实体,从而在保存到数据库时生成实体的快照。
这是在 Doctrine 2 网站上的一篇博客文章中讨论的原型的扩展版本
http://www.doctrine-project.org/blog/doctrine2-versionable
修改了接口 Versionable
,删除了所有的 getResourceId()
、getVersionedData()
和 getCurrentVersion()
方法,因为 Doctrine 可以通过 UnitOfWork API 轻易地检索这些值。因此,可版本化只是一个标记接口。
可版本化做什么
每当实现可版本化的实体被 更新 时,实体的所有旧值都将与其旧版本号一起保存到新创建的 ResourceVersion
实体中。
实体需求
- 单标识符列(字符串或整数)
- 实体必须可版本化(使用 @version 注解)
实现 Versionable
的样子
<?php namespace MyProject; use DoctrineExtensions\Versionable\Versionable; class BlogPost implements Versionable { // blog post API }
配置
您必须将 DoctrineExtensions\Versionable\Entity\ResourceVersion
实体添加到您的元数据路径中。它使用注解元数据驱动,因此您必须在命令行中指定或配置到该目录的路径。另外,如果您使用任何其他元数据驱动,您必须包装 Doctrine\ORM\Mapping\Driver\DriverChain
以允许使用多个元数据驱动。
您还需要在构造时明确地将 VersionListener
钩接到 EntityManager 的 EventManager 上。
<?php $eventManager = new EventManager(); $eventManager->addEventSubscriber(new VersionListener()); $em = EntityManager::create($connOptions, $config, $eventManager);
使用 VersionManager
,您现在可以检索可版本化实体的所有版本。
<?php $versionManager = new VersionManager($em); $versions = $versionManager->getVersions($blogPost);
或者,您可以将版本回滚到特定的版本号。
<?php $versionManager = new VersionManager($em); $versionManager->revert($blogPost, 100); $em->flush();
marijn/patch-1