Hãy để tôi cố gắng làm rõ những gì có thể, không thể và được lên kế hoạch với các ví dụ.
Các trích dẫn từ cuốn hướng dẫn về cơ bản có nghĩa là bạn có thể có các loại thực hiện tùy chỉnh sau:
use Doctrine\Common\Collections\Collection;
// MyCollection is the "implementation type"
class MyCollection implements Collection {
// ... interface implementation
// This is not on the Collection interface
public function myCustomMethod() { ... }
}
Bây giờ bạn có thể sử dụng nó như sau:
class MyEntity {
private $items;
public function __construct() {
$this->items = new MyCollection;
}
// ... accessors/mutators ...
}
$e = new MyEntity;
$e->getItems()->add(new Item);
$e->getItems()->add(new Item);
$e->getItems()->myCustomMethod(); // calling method on implementation type
// $em instanceof EntityManager
$em->persist($e);
// from now on $e->getItems() may only be used through the interface type
Nói cách khác, miễn là một thực thể là MỚI (không được quản lý, mở hoặc loại bỏ) bạn được tự do sử dụng loại triển khai cụ thể của các bộ sưu tập, ngay cả khi nó không đẹp. Nếu nó không phải là MỚI, bạn phải truy cập chỉ loại giao diện (và lý tưởng kiểu gợi ý trên nó). Điều đó có nghĩa là loại triển khai thực sự không quan trọng. Khi một cá thể MyEntity liên tục được lấy ra từ cơ sở dữ liệu, nó sẽ không sử dụng MyCollection (các hàm tạo không được Doctrine gọi, kể từ khi Doctrine chỉ tái tạo các đối tượng tồn tại/liên tục, nó không bao giờ tạo ra các đối tượng mới). Và kể từ khi một thực thể như vậy được quản lý, truy cập phải xảy ra thông qua các loại giao diện anyways.
Bây giờ cho những gì được lên kế hoạch. Cách đẹp hơn để có bộ sưu tập tùy chỉnh là cũng có loại giao diện tùy chỉnh, giả sử IMyCollection và MyCollection là loại triển khai.Sau đó, để làm cho nó hoạt động hoàn hảo với các dịch vụ kiên trì thuyết 2 bạn sẽ cần phải thực hiện một cài đặt tùy chỉnh PersistentCollection, nói, MyPersistentCollection mà trông như thế này:
class MyPersistentCollection implements IMyCollection {
// ...
}
Sau đó, bạn sẽ nói với Giáo lý trong các bản đồ để sử dụng MyPersistentCollection trình bao bọc cho bộ sưu tập đó (hãy nhớ, một PersistentCollection kết thúc tốt đẹp một loại triển khai bộ sưu tập, triển khai cùng một giao diện, để nó có thể thực hiện tất cả các công việc tồn tại trước/sau khi ủy nhiệm cho kiểu triển khai bộ sưu tập cơ bản).
Vì vậy, việc thực hiện bộ sưu tập tùy chỉnh sẽ bao gồm 3 phần:
- loại Interface
- loại thực hiện (thực hiện loại giao diện)
- dai dẳng loại wrapper (thực hiện loại giao diện)
Điều này sẽ không chỉ làm cho nó có thể viết các bộ sưu tập tùy chỉnh mà làm việc dường như với Doctrine 2 ORM mà còn để viết chỉ một loại trình bao bọc liên tục tùy chỉnh, cho e xample để tối ưu hóa hành vi tải/khởi tạo lười biếng của một bộ sưu tập cụ thể đối với các nhu cầu ứng dụng cụ thể.
Bạn chưa thể thực hiện việc này nhưng sẽ thực hiện được. Đây là cách thực sự thanh lịch và đầy đủ chức năng để viết và sử dụng các bộ sưu tập hoàn toàn tùy chỉnh tích hợp hoàn hảo trong lược đồ kiên trì trong suốt được cung cấp bởi Doctrine 2.
Đối với những người đến đây để tìm câu trả lời: Tính đến thời điểm này, [tính năng] (https://github.com/doctrine/doctrine2/issues/5057) vẫn chưa được triển khai, vui lòng đóng góp trong chuỗi thảo luận tính năng (upvotes, trường hợp sử dụng, giải pháp của bạn). – Arkemlar