2011-12-09 7 views
9

Trong các phiên bản cũ hơn của Symfony bạn đã sử dụng để có thể xây dựng các đối tượng mới trong một đối tượng dữ liệu bằng cách mở rộng một lớp mô hình với một lớp con mở rộng.Làm thế nào để bạn mở rộng một thực thể trong Symfony2 giống như bạn đã từng sử dụng trong Symfony 1?

Ví dụ, tôi đã có một mô hình câu hỏi có bảng kết quả. Bảng kết quả đó có một lớp mô hình Result.php được sử dụng để thiết lập và nhận các kết quả thông qua Doctrine. Sau đó tôi đã sử dụng lớp con mô hình ResultPeer.php để thêm một hàm mới vào đối tượng Result lấy kết quả và tùy thuộc vào một tập hợp các ngưỡng cố định được tính toán một điểm và màu tương ứng.

Trong phiên bản Symfony2 mới bằng Doctrine2 Tôi đang cố gắng tìm ra cách tốt nhất để thực hiện việc này. Khi tạo một thực thể, tôi chỉ có thể tìm thấy trong tài liệu khả năng thêm các đối tượng dựa trên các mối quan hệ cấu trúc dữ liệu.

Tôi đã xem các kho lưu trữ thực thể, nhưng điều đó không xuất hiện để mở rộng hoặc thêm chức năng cho đối tượng gốc. Nó dường như mang lại các đối tượng dữ liệu dựa trên các truy vấn phức tạp hơn các hàm truy vấn chuẩn.

Tôi cũng xem xét các dịch vụ mà tôi có thể sử dụng để thu thập đối tượng và sau đó sử dụng đối tượng tạo một mảng mới bao gồm đối tượng này và dữ liệu mới được tạo ra, nhưng điều này dường như không đúng hoặc theo triết lý mà Symfony là tất cả về.

Có ai biết các chức năng có thể được thêm vào đối tượng dữ liệu hiện có hay không. Tôi thấy nó thực sự hữu ích trong phiên bản cũ của Symfony, nhưng dường như không thể tìm thấy sự thay thế trong phiên bản mới của Symfony2.

Trả lời

18

Mở rộng thực thể là cách để thực hiện. Trong thế giới Doctrine2, chúng nói về ánh xạ thừa kế. Đây là một ví dụ mã. Nó định nghĩa một BaseEntity sau đó nó được mở rộng để tạo ra một BaseAuditableEntity và cuối cùng là một thực thể User mở rộng BaseAuditableEntity. Bí quyết là sử dụng chú thích @Orm\MappedSuperclass. Kế hoạch kế thừa này sẽ tạo ra một bảng đơn ngay cả khi có ba thực thể trong biểu đồ quan hệ của tôi. Điều này sau đó sẽ hợp nhất tất cả các thuộc tính vào một bảng duy nhất. Bảng được tạo sẽ chứa mọi thuộc tính được ánh xạ qua các mối quan hệ, tức là các thuộc tính từ BaseAuditableEntity và từ User. Đây là ví dụ mã:

Acme\WebsiteBundle\Entity\BaseEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseEntity { 

} 

Acme\WebsiteBundle\Entity\BaseAuditableEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseAuditableEntity extends BaseEntity { 

    private $createdBy; 

    /** 
    * @Orm\Column(type="datetime", name="created_at") 
    */ 
    private $createdAt; 

    /** 
    * @Orm\ManyToOne(targetEntity="User") 
    * @Orm\JoinColumn(name="updated_by", referencedColumnName="id") 
    */ 
    private $updatedBy; 

    /** 
    * @Orm\Column(type="datetime", name="updated_at") 
    */ 
    private $updatedAt; 

    // Setters and getters here 
} 

Acme\WebsiteBundle\Entity\User.php

namespace Acme\WebsiteBundle\Entity; 

use Acme\WebsiteBundle\Entity\BaseAuditableEntity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\Entity(repositoryClass="Acme\WebsiteBundle\Entity\Repository\UserRepository") 
* @Orm\Table(name="acme_user") 
*/ 
class User extends BaseAuditableEntity implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @Orm\Id 
    * @Orm\Column(type="integer") 
    * @Orm\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @Orm\Column(type="string", name="first_name") 
    */ 
    private $firstName; 

    /** 
    * @Orm\Column(type="string", name="last_name") 
    */ 
    private $lastName; 

    /** 
    * @Orm\Column(type="string", unique="true") 
    */ 
    private $email; 

    // Other properties 

    // Constructor 

    // Setters and getters 
} 

Dưới đây là một liên kết đến các tài liệu hướng dẫn lập bản đồ thừa kế chính thức của Học thuyết 2.1: here

Hy vọng điều này sẽ giúp, đừng ngần ngại bình luận nếu bạn cần thêm thông tin.

Trân trọng,
Matt

+1

Điều đó thật tuyệt vời. Tôi biết nó phải có khả năng. Cảm ơn Matt. –

+0

Giả sử, tôi có 'BaseAuditableEntity.php' có cột' lastName' với nullable = false, sau đó mở rộng lớp thành 'User.php'. Tôi cần phải thay đổi coulumn ở trên lastname chấp nhận giá trị null (nullable = true). Bạn sẽ giúp tôi, làm thế nào để làm như vậy? –

+0

Trong lớp 'User.php' của bạn, cố gắng redfine thuộc tính' lastName' và chú thích liên quan đến nó.Có lẽ điều này sẽ ghi đè lên những gì đã được thiết lập trước đó trong thực thể cơ sở. Nếu nó không hoạt động, tôi sợ rằng tôi không thể giúp đỡ thêm. Hãy thử hỏi trên danh sách gửi thư doctrine2. Nếu bạn tìm thấy giải pháp, vui lòng báo cáo giải pháp tại đây. – Matt