荷兰桥/doctrine-extensions

此软件包最新版本(v0.1)没有可用的许可信息。

v0.1 2012-05-16 07:04 UTC

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

  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 扩展提供了对 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