2012-03-21 5 views
18

Tôi muốn tạo một số gói Symfony2 có thể sử dụng lại trên các dự án khác nhau, nhưng các thực thể cũng có thể dễ dàng mở rộng nếu cần.Tạo các gói di động với các thực thể mở rộng trong Symfony2

Ví dụ có thể là UserBundle có thể tái sử dụng, chứa một thực thể Người dùng có tất cả ánh xạ ORM được xác định. Tuy nhiên, trong ứng dụng của tôi, tôi có thể muốn mở rộng thực thể này và thêm các cột bổ sung, các liên kết hoặc ghi đè một số ánh xạ của cha mẹ.

Giải pháp gần nhất tôi có thể tìm thấy là các lớp siêu ánh xạ của Doctrine2, nhưng sau đó tôi sẽ mất khả năng cắm và chạy của gói có thể tái sử dụng, tôi luôn phải mở rộng lớp phủ bản đồ trong ứng dụng ngay cả khi tôi không ' Tôi muốn sửa đổi ánh xạ.

Các kế hoạch thừa kế tài liệu khác yêu cầu sửa đổi ánh xạ của cha mẹ, và sau đó UserBundle của tôi sẽ không được di động nữa trên các dự án.

Có cách nào để xác định thực thể hoàn toàn làm việc trong một gói và vẫn mở rộng trong một gói khác không?

+0

+1 Tôi đã rút ra kết luận tương tự như bạn, bạn đã bao giờ tìm ra một giải pháp? – Steve

+0

Không, có vẻ như không thể với các mô hình kế thừa hiện tại trong Doctrine. – Gerry

+2

Bất kỳ tin tức nào về vấn đề này? Tôi đã đấu tranh với giới hạn này rất nhiều lần mà tôi tự hỏi nếu một sửa chữa thực sự sẽ được ban hành ở tất cả. Đẻ bó chỉ để thêm một trường trong ánh xạ thực thể đang cũ. –

Trả lời

11

Để tham khảo trong tương lai, điều này có thể được giải quyết bằng cách sử dụng target entity resolution.

Bạn có thể tìm thêm thông tin trong Symfony docs.

Các bước thực hiện khá straighforward:

  1. Tạo một giao diện trong nhóm của mình cho các tổ chức User

    namespace Acme/UserBundle/Model; 
    interface UserInterface 
    { 
        // public functions expected for entity User 
    } 
    
  2. Làm cơ sở của bạn User tổ chức thực hiện giao diện

    namespace Acme/UserBundle/Entity; 
    /** 
    * @ORM\Entity 
    */ 
    class User implements UserInterface 
    { 
        // implement public functions 
    } 
    
  3. Tạo mối quan hệ như bình thường, nhưng sử dụng giao diện

    namespace Acme/InvoiceBundle/Entity; 
    /** 
    * @ORM\Entity 
    */ 
    class Invoice 
    { 
        /** 
        * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface") 
        */ 
        protected $user; 
    } 
    
  4. Configure người nghe bằng cách thêm dòng sau vào config.yml

    doctrine: 
        # .... 
        orm: 
         # .... 
         resolve_target_entities: 
          Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User 
    

Nếu bạn muốn tùy chỉnh User tổ chức cho các ứng dụng hiện tại của bạn

  1. Kéo dài từ.210 lớp học hoặc thực hiện UserInterface

    namespace Acme/WebBundle/Entity; 
    use Acme/UserBundle/Entity/User as BaseUser; 
    /** 
    * @ORM\Entity 
    */ 
    class User extends BaseUser 
    { 
        // Add new fields and functions 
    } 
    
  2. Configure người nghe phù hợp

    doctrine: 
        # .... 
        orm: 
         # .... 
         resolve_target_entities: 
          Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User