Это связано с моим другим вопросом: Сохраняющиеся объекты, использующие API REST.
Для проекта в Symfony2 мне нужно иметь возможность сохранять объекты, используя удаленный (сторонний) RESTful API. Я также хочу иметь возможность извлекать объекты с данными из этого API.
Другими словами, мои объекты сохраняются в сторонней базе данных. Они не сохраняются в моей собственной базе данных. Всякий раз, когда мне нужно сохранять данные или находить данные, я использую их REST API.
Я указал на несколько библиотек, в том числе как работать с несколькими Менеджерами Entity. Я ищу решение, подобное этому, но с менеджером сущностей, который позволяет мне использовать REST вместо DB.
Я пытался самостоятельно настроить Doctrine ORM, но я только переписываю половину своего кода, потому что он (кажется, слишком) тесно связан с логикой, специфичной для базы данных. Конечно, я мог бы делать что-то глупое.
Итак, мой вопрос: есть ли способ заменить/переопределить узлы базы данных Doctrine ORM с помощью специальных? Не переписывая много вещей, которые должны быть общими для всех методов сохранения? Это было сделано раньше? Или это просто невозможно, потому что Doctrine предназначен для использования с базой данных и недостаточно гибка для других целей?
Мой собственный прогресс
CakePHP, похоже, может это сделать, позволяя вам определить пользовательский DataSource. Таким образом, вы можете сохранить свои модели с использованием базы данных SQL, но также использовать API, сеансы и т.д. Я хочу сделать примерно то же самое, но с помощью Doctrine вместо CakePHP.
Обновление 1
Фактические запросы к базе данных, похоже, выполняются
Doctrine\ORM\Persisters\BasicEntityPersister
класс. Существует несколько других классов xxxPersister для решения разных типов наследования. Возможно, можно заменить классы xxxPersister собственными, поэтому мы можем заменить код DB кодом API REST.
Объекты persister создаются в методе getEntityPersister()
класса Doctrine\ORM\UnitOfWork
. Классные имена жестко запрограммированы, поэтому нам нужно переопределить Doctrine\ORM\UnitOfWork
, если мы хотим использовать наши собственные персисты.
Обновление 2
Doctrine\ORM\UnitOfWork
кажется жестко закодированным в Doctrine\ORM\EntityManager
, поэтому нам нужно переопределить и этот. Однако этот класс, как представляется, содержит некоторые части, относящиеся к базе данных. Например, для этого конструктора в качестве параметра требуется объект Doctrine\DBAL\Connection
. Возможно, лучше создать собственный EntityManger (реализующий интерфейс Doctrine\Common\Persistence\ObjectManager
), если это не займет слишком много времени/усилий.
Обновление 3
Код для поиска/загрузки/поиска по базе данных живет в том же классе, что и код для сохранения/удаления и т.д.: классы Doctrine\ORM\Persisters\xxxPersister
. Поэтому, если мы можем заменить их своими собственными, чтобы сохранить объекты, мы также можем восстановить объекты. Когда вы вызываете $entityRepository->findAll()
, например, он вернет $entityRepository->findBy(array())
(потому что findAll()
является просто псевдонимом для findBy(array())
), который будет запускать следующий код:
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
return $persister->loadAll($criteria, $orderBy, $limit, $offset);
Другими словами, как только мы получим EntityManager
для создания правильных объектов UnitOfWork
и xxxPersister
, мы сможем использовать методы find
в EntityRepository
.
Обновление 4
Я обнаружил, что для Doctrine разработана новая функция: пользовательские persisters (также см. это). Это должно облегчить использование пользовательского класса persister. Я еще не знаю, сможет ли он создать не-БД-персидер, но он выглядит многообещающим. Однако последние обновления были в августе, поэтому я не уверен, что он все еще находится в активной разработке.