Если вы используете собственный EntityManager, вы можете переопределить метод getRepository. Поскольку это не связано с событием loadClassMetadata, вы не столкнетесь с бесконечным циклом.
Сначала вам нужно будет передать зависимость вашему пользовательскому EntityManager, а затем вы передадите ее объекту репозитория, используя инъекцию установщика.
Я ответил, как использовать собственный EntityManager здесь, но я воспроизведу ответ ниже:
1 — Переопределите параметр doctrine.orm.entity_manager.class, чтобы он указывал на ваш пользовательский менеджер сущностей (который должен расширять Doctrine\ORM\EntityManager).
2. Ваш пользовательский менеджер сущностей должен переопределить метод create, чтобы он возвращал экземпляр вашего класса. Посмотрите мой пример ниже и обратите внимание на последнюю строку, касающуюся MyEntityManager:
public static function create($conn, Configuration $config, EventManager $eventManager = null) {
if (!$config->getMetadataDriverImpl()) {
throw ORMException::missingMappingDriverImpl();
}
if (is_array($conn)) {
$conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, ($eventManager ? : new EventManager()));
} else if ($conn instanceof Connection) {
if ($eventManager !== null && $conn->getEventManager() !== $eventManager) {
throw ORMException::mismatchedEventManager();
}
} else {
throw new \InvalidArgumentException("Invalid argument: " . $conn);
}
// This is where you return an instance of your custom class!
return new MyEntityManager($conn, $config, $conn->getEventManager());
}
Вам также потребуется use следующее в своем классе:
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\ORMException;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Connection;
Изменить
Поскольку менеджер сущностей по умолчанию создается из метода create, вы не можете просто внедрить в него службу. Но поскольку вы создаете собственный менеджер сущностей, вы можете подключить его к контейнеру службы и внедрить любые необходимые вам зависимости.
Затем внутри переопределенного метода getRepository вы можете сделать что-то вроде
$repository->setFoo($this->foo). Это очень простой пример — вы можете сначала проверить, есть ли у $repository метод setFoo, прежде чем вызывать его. Реализация зависит от вас, но это показывает, как использовать инъекцию сеттера для репозитория.
person
Steven Mercatante
schedule
16.11.2011