这是我的捆绑主文件
的方式<?php
namespace Foo\FooBundle;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class FooBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
}
public function boot()
{
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('custom_date', 'Foo\FooBundle\Doctrine\DBAL\Types\CustomDate');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('custom_date','custom_date');
}
}
所以你可能会在晚上我有一个我在我的捆绑的boot()
操作期间注册的自定义类型。
现在,在我的测试中,我遇到了一些问题。某些测试需要使用静态函数setUpBeforeClass()
和tearDownAfterClass()
,因为我需要EntityManager
和Container
。在我的函数下面(公共到多个测试类)
public static function setUpBeforeClass()
{
static::$kernel = static::createKernel();
static::$kernel->boot();
self::$em = static::$kernel->getContainer()
->get('doctrine')
->getManager()
;
}
public static function tearDownAfterClass()
{
parent::tearDown();
self::$em->close();
}
现在,如果我运行多个使用static::$kernel->boot();
的测试类,由于DBAL异常表示custom_date
类型已经注册,一些测试失败。
这对我来说很奇怪,因为parent::tearDown();
函数是
/**
* Shuts the kernel down if it was used in the test.
*/
protected function tearDown()
{
if (null !== static::$kernel) {
static::$kernel->shutdown();
}
}
和static::$kernel->shutdown();
是
public function shutdown()
{
if (false === $this->booted) {
return;
}
$this->booted = false;
foreach ($this->getBundles() as $bundle) {
$bundle->shutdown();
$bundle->setContainer(null);
}
$this->container = null;
}
所以,对我来说,如果bundle被关闭,那么即使他的自定义类型也应该是未注册的。看来他们没有。
<小时/>
我修改了boot()
函数以检查类型是否已经注册
public function boot()
{
if (false === Type::hasType('custom_date')) {
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('custom_date', 'Foo\FooBundle\Doctrine\DBAL\Types\CustomDate');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('custom_date','custom_date');
}
}