Symfony 3的Doctrine Fixtures的多个文件

时间:2018-04-09 09:29:29

标签: symfony fixtures

我正在使用捆绑包Doctrine:Fixtures来加载bbdd的示例抛出实体,因为我在项目中单独工作就可以了。

但是现在,我在我的项目中找到了一位同事,我们想知道是否可以为装载设置不同的文件。

我在git中获得了自己的灯具文件,我不想让他修改这个文件。我想为他准备一个特殊文件,只要他想要这个固定装置文件就可以修改。所以,任何人都可以在bbdd的init中拥有自己的拥有记录。

如果多个文件不可能,可以用其他方式吗?

http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

1 个答案:

答案 0 :(得分:1)

您可以使用--fixture标志加载特定的灯具文件: php app/console doctrine:fixtures:load --fixture=/src/BundleName/DataFixtures/ORM/Fixture.php

或者,您可以添加一个包含一些工作示例的Fixtures.php.dist文件,然后使用.gitignore忽略Fixtures.php

然后在您的构建(或作曲家脚本)和/或文档中添加一个命令,以便在签出项目时将此.dist文件复制到Fixtures.php

如果您正在进行BDD,另一种方法是创建一个Helper类,可以在Context中使用,以便在测试中根据需要创建和保留实体。这将允许您仅创建测试所需的细节。它真正需要的只是EntityManager所以它可能比预先定义所有灯具更简单。

您可以使用Faker生成逼真的实体。

class AbstractFixtureHelper implements ContainerAwareInterface
{
    /**
     * @var Generator
     */
    protected $faker;

    /**
     * @var ContainerInterface
     */
    protected $container;

    public function __construct()
    {
        $this->faker = Factory::create();
    }

    /**
     * @param ContainerInterface|null $container
     * @return void
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    /**
     * @return EntityManager
     */
    protected function getEntityManager()
    {
        return $this->container->get('doctrine.orm.entity_manager');
    }
}

然后针对不同的实体 - 在此示例中为用户:

class UserFixtureHelper extends AbstractFixtureHelper
{
    public function createUser()
    {
        $user = new User();
        $user->setEmail($this->faker->email);
        $this->getEntityManager()->persist($user);
        $this->getEntityManager()->flush();

        return $user;
    }
}

然后在您的上下文中,注入UserFixtureHelper并直接在场景步骤中创建。

/**
* @Given there is a User who XXX
*/
public function thereIsAUser()
{
    $user = $this->userFixtureHelper->createUser();
}