mqm / doctrineextensions
Requires
- doctrine/orm: *
This package is not auto-updated.
Last update: 2020-01-01 18:11:50 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的实体
如果您不需要迭代一个获取连接的to-many 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