beelab/memory-repository-bundle

此包已被废弃,不再维护。未建议任何替代包。

用于在内存中使用的Symfony扩展包

安装: 80

依赖者: 0

建议者: 0

安全: 0

星标: 5

关注者: 3

分支: 0

类型:symfony-bundle

dev-master / 0.1.x-dev 2014-01-29 14:59 UTC

This package is auto-updated.

Last update: 2022-02-01 12:30:45 UTC


README

此扩展包的目的是使用Doctrine进行内存中仓库的操作。主要用途是在测试期间,可以避免与数据库交互,而不需要更改任何实现。

安装

将这些行添加到您的composer.json中

    "require": {
        "doctrine/orm": "2.5.*@dev",
        "doctrine/dbal": "2.5.*@dev",
        "doctrine/doctrine-bundle": "~1.3@beta",
        "beelab/memory-repository-bundle": "0.1.*@dev"
    }

然后运行composer update

使用方法

假设您正在使用一个名为Article的实体。在您的实体中,您必须在@ORM\Entity注解中添加repositoryClass值。例如

<?php

namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Repository\ArticleRepository")
 */
class Article
{
    // ...
}

因此,您需要一个ArticleRepositoryClass,它扩展了Doctrine的EntityRepository。现在,创建一个新类,如下所示

<?php

namespace Acme\DemoBundle\MemoryRepository;

use Acme\DemoBundle\Entity\Article;
use Doctrine\Common\Persistence\ObjectRepository;
use Doctrine\ORM\Mapping\ClassMetadata;

class ArticleRepository implements ObjectRepository
{
    protected $_entityName, $_em, $_class;

    /**
     * @param EntityManager         $em
     * @param Mapping\ClassMetadata $class
     */
    public function __construct($em, ClassMetadata $class)
    {
        $this->_entityName = $class->name;
        $this->_em         = $em;
        $this->_class      = $class;
    }

    /**
     * {@inheritDoc}
     */
    public function find($id)
    {
        // implement as you prefer...
    }

    /**
     * {@inheritDoc}
     */
    public function findAll()
    {
        // implement as you prefer...
    }

    /**
     * {@inheritDoc}
     */
    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
    {
        // implement as you prefer...
    }

    /**
     * {@inheritDoc}
     */
    public function findOneBy(array $criteria)
    {
        // this is just an example...
        if (isset($criteria['slug']) && $criteria['slug'] == 'an-article') {
            $article = new Article();
            $article
                ->setTitle('An article')
                ->setText('Lorem ipsum dolor sit amet.')
            ;

            return $article;
        }
    }

    /**
     * {@inheritDoc}
     */
    public function getClassName()
    {
        return $this->_entityName;
    }
}

目前,您必须使用名为"Repository"和"EntityRepository"的目录(和命名空间)。这有点丑,我们希望改进。

最后,将以下内容添加到您的config_test.yml中

doctrine:
    orm:
        repository_factory: beelab.repository.factory

完成!现在,当在测试中检索Article对象时,它不是从数据库中检索,而是从您的ArticleRepository中检索,具体取决于您的逻辑。