Yoa*_*net 6 configuration symfony doctrine-orm
我目前正在使用Symfony2和Doctrine2,但我必须覆盖Doctrine2 EntityManager并添加一些"取消删除"功能(内部的ACL).
所以我想知道:有没有办法覆盖EntityManager类并在Symfony2中指定Doctrine2以将其用作EntityManager的实现?
感谢您的任何帮助!
小智 20
在Doctrine 2.4(Doctrine 2.4发布)之后,你需要使用装饰器.不要直接扩展EntityManager.首先,您需要实现自己的实体管理器装饰器,扩展Doctrine\ORM\Decorator\EntityManagerDecorator(如@Dana)但是您不能只将doctrine.orm.entity_manager.class更改为新装饰器,因为EntityManagerDecorator需要EntityManagerInterface在其构造函数中:
public function __construct(EntityManagerInterface $wrapped)
Run Code Online (Sandbox Code Playgroud)
你不能只将doctrine.orm.entity_manager作为参数传递给它,因为它将是一个递归.不要这样做:
return new self(\Doctrine\ORM\EntityManager::create(
Run Code Online (Sandbox Code Playgroud)
你需要的是在像装饰器这样的服务中配置装饰器:
yourcompany_entity_manager:
public: false
class: YourCompany\ORM\EntityManagerDecorator
decorates: doctrine.orm.default_entity_manager
arguments: ["@yourcompany_entity_manager.inner"]
Run Code Online (Sandbox Code Playgroud)
现在,您将把装饰器作为Doctrine的默认实体管理器.@ yourcompany_entity_manager.inner实际上是一个指向doctrine.orm.default_entity_manager的链接,该链接将传递给yourcompany_entity_manager构造函数.
用于配置装饰器的Symfony文档:链接
顺便说一句,这个命令对于调试你的服务非常有用:
app/console container:debug | grep entity_manager
是的,可以通过两个步骤:
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());
}
Run Code Online (Sandbox Code Playgroud)
您还需要use在课堂上进行以下操作:
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\ORMException;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Connection;
Run Code Online (Sandbox Code Playgroud)
说实话,我很惊讶第二步是必需的,我认为应该可以只使用服务容器来完成.
| 归档时间: |
|
| 查看次数: |
6716 次 |
| 最近记录: |