2014-02-16 46 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邏輯時,你將會有更多的失敗測試。測試應儘可能獨立,每次測試一件事。