Symfony/Doctrine: 实体 "schema" 注释不依赖于环境?
Symfony/Doctrine: Entity "schema" annotation not environment dependent?
我在使用 Doctrine 在 Symfony3 中对 运行 进行功能测试时遇到了问题。
我将代码组织成两个包,一个 EntityManager 需要访问它们,实体存储在两个不同的 MySQL 数据库中。
为此,所有实体在其定义中都有一个 "schema" 注释,如下所示:
/**
* @ORM/Table(name="tablename", schema="schema")
* @Entity( ... )
*/
没有这个设置,根据我的经验,Doctrine schema:create 工具无法在正确的数据库中正确地创建实体。
然而,模式注释似乎不被视为依赖于环境。
所以当我想要 运行 需要加载固定装置的功能测试时,ORMPurger 会尝试清除 schema.tablename,它应该使用 table/schema "test_schema"。
有什么方法可以保留模式注释但使其依赖于环境,以便当环境为 "test" 时,使用不同的模式?
编辑:
当您使用不同的 Symfony 环境时,对实体使用 "schema" 注释似乎非常糟糕。至少当与 MySQl 一起使用时,至少我认为这是原因,因为 MySQL 实际上不支持模式。
无论 --env 设置如何,我都尝试从字面上获取模式注释的每个 Symfony 或 Doctrine 命令。
我进行了更多挖掘,发现我需要做的事情完美地列在这里:
Programmatically modify table's schema name in Doctrine2?
所以我添加了一个 EventListener,它根据使用的 EM 添加了正确的模式,所以我不再需要硬编码模式注释。
这是我制作的侦听器的代码:
<?php
namespace /* ... */
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
class MappingListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $eventArgs->getEntityManager();
/** @var ClassMetadata $classMetadata */
$classMetadata = $eventArgs->getClassMetadata();
$database = $entityManager->getConnection()->getDatabase();
$classMetadata->table['schema'] = $database;
}
}
我在使用 Doctrine 在 Symfony3 中对 运行 进行功能测试时遇到了问题。 我将代码组织成两个包,一个 EntityManager 需要访问它们,实体存储在两个不同的 MySQL 数据库中。 为此,所有实体在其定义中都有一个 "schema" 注释,如下所示:
/**
* @ORM/Table(name="tablename", schema="schema")
* @Entity( ... )
*/
没有这个设置,根据我的经验,Doctrine schema:create 工具无法在正确的数据库中正确地创建实体。 然而,模式注释似乎不被视为依赖于环境。
所以当我想要 运行 需要加载固定装置的功能测试时,ORMPurger 会尝试清除 schema.tablename,它应该使用 table/schema "test_schema"。
有什么方法可以保留模式注释但使其依赖于环境,以便当环境为 "test" 时,使用不同的模式?
编辑:
当您使用不同的 Symfony 环境时,对实体使用 "schema" 注释似乎非常糟糕。至少当与 MySQl 一起使用时,至少我认为这是原因,因为 MySQL 实际上不支持模式。 无论 --env 设置如何,我都尝试从字面上获取模式注释的每个 Symfony 或 Doctrine 命令。
我进行了更多挖掘,发现我需要做的事情完美地列在这里:
Programmatically modify table's schema name in Doctrine2?
所以我添加了一个 EventListener,它根据使用的 EM 添加了正确的模式,所以我不再需要硬编码模式注释。
这是我制作的侦听器的代码:
<?php
namespace /* ... */
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
class MappingListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
/** @var EntityManagerInterface $entityManager */
$entityManager = $eventArgs->getEntityManager();
/** @var ClassMetadata $classMetadata */
$classMetadata = $eventArgs->getClassMetadata();
$database = $entityManager->getConnection()->getDatabase();
$classMetadata->table['schema'] = $database;
}
}