Если вы используете пользовательский 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;
Edit
Поскольку менеджер сущностей по умолчанию создается из метода create
, вы не можете просто внедрить в него службу.Но так как вы создаете собственный менеджер сущностей, вы можете подключить его к сервисному контейнеру и внедрить все необходимые зависимости.
Тогда из-за переопределенного метода getRepository
вы можете сделать что-то вроде
$repository->setFoo($this->foo)
.Это очень простой пример - вы можете сначала проверить, есть ли у $repository
метод setFoo
, прежде чем вызывать его.Реализация зависит от вас, но это показывает, как использовать установщик инъекций для хранилища.