mqm / doctrineextensions

此包的最新版本(dev-master)没有可用的许可证信息。

dev-master 2012-04-19 14:18 UTC

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个查询

  1. 计算列表中条目的总数
  2. 获取给定 $limit + $offset 窗口的唯一ID
  3. 获取第2步中给出的所有唯一ID的实体

如果您不需要迭代一个获取连接的to-many DQL查询,您可以缩短

  1. 计算列表中条目的总数
  2. 使用 $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