Позвольте мне пояснить, что возможно, невозможно и спланировано с примерами.
цитата из руководства в основном означает, что вы могли бы иметь следующий пользовательский тип реализации:
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() { ... }
}
Теперь вы можете использовать его следующим образом:
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
Другими словами, до тех пор, пока объект NEW (не УПРАВЛЯЕМЫЙ, ОТКРЫТЫЙ или СНЯТЫЙ), вы можете использовать конкретный тип реализации коллекций, даже если его не очень. Если это не NEW, вы должны получить доступ только к типу интерфейса (и, в идеале, к нему наброски). Это означает, что тип реализации не имеет большого значения. Когда постоянный экземпляр MyEntity извлекается из базы данных, он не будет использовать MyCollection (конструкторы не будут вызываться Doctrine, поскольку Doctrine только восстанавливает уже существующие/постоянные объекты, он никогда не создает «новые»). И поскольку такой объект MANAGED, доступ должен происходить через тип интерфейса в любом случае.
Теперь, что планируется. Более красивый способ создания пользовательских коллекций также иметь собственный тип интерфейса, например IMyCollection и MyCollection в качестве типа реализации.Затем, чтобы сделать его работу отлично с настойчивостью услуг Doctrine 2 вам необходимо будет осуществить реализацию пользовательских PersistentCollection, скажем, MyPersistentCollection который выглядит следующим образом:
class MyPersistentCollection implements IMyCollection {
// ...
}
Тогда вы расскажете Доктрину в отображении использовать MyPersistentCollection wrapper для этой коллекции (помните, PersistentCollection обертывает тип реализации коллекции, реализующий один и тот же интерфейс, чтобы он мог выполнять всю работу настойчивости до/после делегирования к типу реализации базовой коллекции).
Так реализация настраиваемой коллекции будет состоять из 3-х частей:
- Тип интерфейса
- типа реализации (реализует тип интерфейса)
- Persistent типа обертки (реализует тип интерфейса)
Это позволит не только создавать пользовательские коллекции, которые без труда работают с ORM Doctrine 2, но и писать только настраиваемый постоянный тип оболочки, для e xample, чтобы оптимизировать поведение ленивой загрузки/инициализации конкретной коллекции для конкретных приложений.
Это еще не возможно сделать, но это будет. Это единственный действительно элегантный и полностью функциональный способ записи и полностью использовать собственные коллекции, которые интегрируют безукоризненно в прозрачной схеме инерционности, представленной доктриной 2.
Для тех, кто пришел сюда, пытаясь найти ответ: На данный момент [feature] (https://github.com/doctrine/doctrine2/issues/5057) по-прежнему не реализована, внесите свой вклад в обсуждение функций (upvotes, варианты использования, ваши решения). – Arkemlar