striide/doctrine-extensions

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

dev-master 2012-12-14 01:56 UTC

This package is not auto-updated.

Last update: 2024-09-22 03:19:03 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的实体

如果你不需要迭代一个获取连接到的多对一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轻松检索这些值。然后,可版本化只是一个标记接口。

可版本化做什么

每当实现可版本化的实体被更新时,所有实体的旧值都会与其旧版本号一起保存到一个新创建的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