Doctrine DataFixtures是否应该与自定义捆绑包中的逻辑隔离?

时间:2014-02-16 22:38:38

标签: php symfony doctrine-orm

我想知道有关Symfony2的DataFixtures的最佳实践。例如,我有RoleUser

RoleFixtures:

class RoleFixtures extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load(ObjectManager $manager)
    {
        $userRole = new Role();
        $userRole->setName("user");
        $userRole->setRole("ROLE_USER");
        $manager->persist($userRole);
        $manager->flush();

        $adminRole = new Role();
        $adminRole->setName("admin");
        $adminRole->setRole("ROLE_ADMIN");
        $manager->persist($adminRole);
        $manager->flush();
    }

    public function getOrder()
    {
        return 1;
    }

UserFixtures:

class UserFixtures extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load(ObjectManager $manager)
    {
        $roleManager = $this->container->get('elite_fifa.role_manager');
        $userRole = $roleManager->getRoleByName("user");
        $adminRole = $roleManager->getRoleByName("admin");

        $userManager = $this->container->get('elite_fifa.user_manager');

        $user1 = $userManager->createUser();
        $user1->setUsername("user1");
        $user1->setEmail("my1@email.com");
        $user1->addRole($userRole);
        $encoder = $this->container->get('security.encoder_factory')->getEncoder($user1);
        $encodedPass = $encoder->encodePassword('pass1', $user1->getSalt());
        $user1->setPassword($encodedPass);
        $manager->persist($user1);
        $manager->flush();

        $user2 = $userManager->createUser();
        $user2->setUsername("user2");
        $user2->setEmail("my2@email.com");
        $user2->addRole($adminRole);
        $encoder = $this->container->get('security.encoder_factory')->getEncoder($user2);
        $encodedPass = $encoder->encodePassword('pass2', $user1->getSalt());
        $user2->setPassword($encodedPass);
        $manager->persist($user2);
        $manager->flush();

    }

    public function getOrder()
    {
        return 2;
    }
}

看看UserFixtures中的load方法,我可以使用$roleManager->getRoleByName("user")而不是使用references中内置的DataFixtures吗?

我在考虑这样做,我正在重用代码并添加另一条路径进行测试。但是将Fixtures与bundle逻辑结合起来是不好的做法?感谢

1 个答案:

答案 0 :(得分:2)

对我来说,这取决于一个问题:你使用这些灯具做什么?

  • 为您的应用程序(创建引导应用程序所需的用户和角色)。在这种情况下,我不介意使用捆绑逻辑,因为它可以包含您想要重用的业务逻辑。
  • 对于你的测试(我认为这就是你正在做的事情)。在这种情况下,您不希望使用捆绑逻辑。确实,它“添加了另一条测试路径”,但您应该将所有测试分开,或者当您更改RoleManager逻辑时,您将遇到比必要更多的失败测试。测试应尽可能独立,每个测试一次测试一件事。