2011-12-10 86 views
7

我使用DoctrineFixtures捆綁發展過程中創造的實體例子。在我的ORM fixtures load()方法中,我將數據定義爲關聯數組,並在循環中創建實體對象。地圖數組中的Symfony2/Doctrine2實體

<?php 
// ... 
public function load($manager) { 
    $roleDefs = array(
     'role-1' => array(
      'role' => 'administrator' 
     ), 
     'role-2' => array(
      'role' => 'user' 
     ), 
    ); 

    foreach($roleDefs as $key => $roleDef) { 
     $role = new Role(); 
     $role->setRole($roleDef['role']); 
     $manager->persist($role); 

     $this->addReference($key, $role); 
    } 

    $manager->flush(); 
} 

我總是使用相同的數組模式。每個數組元素都使用實體的屬性名稱(以下劃線表示法)作爲索引。如果實體結構變得更復雜,則會有很多$entity->setMyProperty($def['my_property']);行。

我認爲映射propertynames到setter方法的問題是在Symfony和學說很常見的問題,因爲這類型的映射在許多情況下被發現(例如,映射形式實體)。

現在我想知道是否有可用於映射一個內置的方法。這將是不錯的有像

foreach($defs as $key => $def) { 
    $entity = $magicMapper->getEntity('MyBundle:MyEntity', $def); 
    // ... 
} 

一個解決方案的人知道如何可以做到這一點?

非常感謝, Hacksteak

回答

14

我創建燈具時,有時會使用循環。我不確定這個解決方案是否符合你的要求,但是我發現,如果你需要的話,建立裝置和快速添加新屬性的最靈活的方法是做下面的事情......假設創建了一堆博客帖子:

// an array of blog post fixture values 
$posts = array(
    array(
     'title' => 'Foo', 
     'text' => 'lorem' 
     'date' => new \DateTime('2011-12-01'), 
    ), 
    array(
     'title' => 'Bar', 
     'text' => 'lorem' 
     'date' => new \DateTime('2011-12-02'), 
    ), 
    // more data... 
); 

// loop over the posts 
foreach ($posts as $post) { 
    // new entity 
    $post = new Post(); 

    // now loop over the properties of each post array... 
    foreach ($post as $property => $value) { 
     // create a setter 
     $method = sprintf('set%s', ucwords($property)); // or you can cheat and omit ucwords() because PHP method calls are case insensitive 
     // use the method as a variable variable to set your value 
     $post->$method($value); 
    } 

    // persist the entity 
    $em->persist($post); 
} 

這樣,您可以通過將新值添加到數組來添加更多屬性。

+1

我現在在en外部類中使用了一些修改(支持下劃線和加法)的解決方案。 – hacksteak25

+1

我之前看到過這個解決方案,但我認爲可以更靈活地解決這個問題。內部氫化物如何? –

+0

我一定會對聽到更靈活的解決方案感興趣,所以我都是耳朵! –