2014-02-16 52 views
1

我想知道有关Symfony2的DataFixtures的最佳实践。例如,我有RoleUserDoctrine DataFixtures应该与自定义包中的逻辑隔离吗?

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("[email protected]"); 
     $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("[email protected]"); 
     $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负载的方法,我可以用$roleManager->getRoleByName("user")而不是使用内置的references DataFixtures的?

我正在考虑按照我的方式,我正在重复使用代码并添加另一个路径来测试。但是,将固定装置与捆绑逻辑结合起来不好吗?谢谢

+0

你能详细阐述一下为什么你不使用内建的'references'功能吗?通过添加另一条路径来测试你的意思是什么? – nifr

回答

2

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

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