agentor / doctrine-extensions
Requires
- doctrine/orm: *
Requires (Dev)
- phpunit/phpunit: 3.7.*
README
此软件包包含对Doctrine 2的多个扩展,它通过钩子连接到Doctrine的功能,并提供使用Doctrine 2的新功能或工具,以提高其效率。
包括 DoctrineExtensions
要包含 DoctrineExtensions,需要启动自动加载器,例如
<?php $classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions', "/path/to/extensions"); $classLoader->register();
Paginator
分页器提供了一种强大的方式来迭代任何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扩展提供了对PHPUnits数据库扩展的几个钩子,并提供了非常方便的方法来测试您的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检索这些值。Versionable只是一个标记接口。
Versionable的作用
每当实现Versionable的实体被 更新 时,实体中所有旧值都会与其旧版本号一起保存到一个新创建的 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