2011-12-10 28 views
7

Tôi đang sử dụng gói DoctrineFixtures để tạo các thực thể mẫu trong khi phát triển. Trong phương thức load() của ORM fixtures, tôi định nghĩa dữ liệu là mảng kết hợp và tạo đối tượng thực thể trong một vòng lặp.Mảng bản đồ cho thực thể trong 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(); 
} 

Tôi luôn sử dụng cùng một lược đồ mảng. Mỗi phần tử mảng sử dụng tên thuộc tính (trong ký hiệu gạch dưới) của thực thể dưới dạng chỉ mục. Nếu cấu trúc tổ chức trở nên phức tạp hơn, có rất nhiều dòng $entity->setMyProperty($def['my_property']);.

Tôi nghĩ rằng vấn đề ánh xạ tên thuộc tính cho các phương thức setter là một vấn đề rất phổ biến trong Symfony và Doctrine khi loại ánh xạ này được tìm thấy trong nhiều tình huống (ví dụ: ánh xạ biểu mẫu cho thực thể).

Bây giờ tôi tự hỏi nếu có một phương pháp tích hợp có thể được sử dụng để lập bản đồ. Sẽ rất tuyệt khi có giải pháp như

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

Có ai đó có thể đạt được điều này bằng cách nào?

Thanks a lot, Hacksteak

Trả lời

14

Tôi đôi khi sử dụng vòng lặp khi tạo đồ đạc. Tôi không chắc chắn nếu giải pháp này phù hợp với yêu cầu của bạn, nhưng tôi thấy rằng cách linh hoạt nhất để xây dựng đồ đạc và nhanh chóng thêm các thuộc tính mới theo thời gian nếu bạn cần là làm như sau ... Giả sử tạo một loạt các bài đăng trên blog :

// 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); 
} 

Bằng cách này bạn có thể thêm nhiều thuộc tính hơn bằng cách chỉ thêm giá trị mới vào mảng của mình.

+1

Tôi hiện đang sử dụng giải pháp của bạn với một số sửa đổi (hỗ trợ cho gạch dưới và phương thức bổ sung) trong vi lớp bên ngoài. – hacksteak25

+1

Tôi đã xem giải pháp này trước đây, nhưng tôi nghĩ rằng có thể giải quyết vấn đề này linh hoạt hơn. Làm thế nào về hydrators nội bộ? –

+0

Tôi chắc chắn sẽ quan tâm đến việc nghe một giải pháp linh hoạt hơn, vì vậy tôi là tất cả các tai! –

Các vấn đề liên quan