1

我将一个项目从 Symfony 2.0 升级到 2.1。之后我的测试停止工作。问题是我使用了实现 ContainerAware 接口的装置。现在升级后 setContainer() 方法不再被调用。我尝试进一步升级到 2.2。问题仍然存在。

作曲家.json:

{
"name": "symfony/framework-standard-edition",
"license": "MIT",
"type": "project",
"description": "The \"Symfony Standard Edition\" distribution",
"autoload": {
    "psr-0": { "": "src/" }
},
"require": {
    "php": ">=5.3.3",
    "symfony/symfony": "2.2.*",
    "doctrine/orm": ">=2.2.3,<2.5-dev",
    "doctrine/doctrine-bundle": "1.2.*",
    "twig/extensions": "1.0.*@dev",
    "symfony/assetic-bundle": "2.1.*",
    "symfony/swiftmailer-bundle": "2.2.*",
    "symfony/monolog-bundle": "2.2.*",
    "sensio/distribution-bundle": "2.2.*",
    "sensio/framework-extra-bundle": "2.2.*",
    "sensio/generator-bundle": "2.2.*",
    "jms/security-extra-bundle": "1.4.*",
    "jms/di-extra-bundle": "1.3.*",
    "kriswallsmith/assetic": "1.1.*@dev",
"knplabs/knp-menu-bundle":"dev-master",
"knplabs/knp-menu":"dev-master",
    "doctrine/doctrine-fixtures-bundle": "dev-master",
    "doctrine/data-fixtures": "1.0.*@ALPHA",
"doctrine/migrations": "dev-master",
"doctrine/doctrine-migrations-bundle": "dev-master",
    "jms/translation-bundle": "dev-master"


},
"scripts": {
    "post-install-cmd": [
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
    ],
    "post-update-cmd": [
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
        "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
    ]
},
"extra": {
    "symfony-app-dir": "app",
    "symfony-web-dir": "web",
    "branch-alias": {
        "dev-master": "2.2-dev"
    }
}

}

我的夹具看起来像这样:

加载用户数据.php

<?php
namespace FINDOLOGIC\CustomerLoginBundle\DataFixtures\ORM;

use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;


class LoadUserData implements FixtureInterface, ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load(ObjectManager $manager)
    {
     [...]
    }
}

在更新到 Symfony 2.1.8 后,我已经查看了Doctrine 固定装置无法正常工作,但它并没有解决我的问题。

我真的很期待您的意见,因为我已经尝试解决这个问题已经有一段时间了。

4

2 回答 2

2

我有完全相同的问题,没有什么可以通过更改轮作曲顺序、内核顺序、扩展或实现等来解决它,所以最后,我只是从测试中传入容器:

public function testLogin()
{

///
$fixture = new UserFixtures();
$fixture->setContainer($container);
///

$executor->execute($loader->getFixtures(), true);

现在它工作正常。

于 2013-07-18T16:12:30.860 回答
-2

解决方案:

确保您不仅实现 ContainerAwareInterface - 您应该扩展 ContainerAware

use Symfony\Component\DependencyInjection\ContainerAware;

// ContainerAware... already implements ContainerAwareInterface

class YourFixture extends ContainerAware 
{
    // ...

另一个建议

将 Datafixtures 在您的 composer.json 中进一步向上移动(在教义/orm 之前),以让 composer 正确生成类映射。

2.0 文档状态。

确保在 Doctrine\Common 之前注册新的命名空间。否则,Symfony 将在 Doctrine\Common 目录中查找数据夹具类。Symfony 的自动加载器总是在第一个匹配的命名空间的目录中寻找一个类,所以更具体的命名空间应该总是放在第一位。

此外,您不需要fixtures-bundle 和fixtures,因为fixtures 是fixtures-bundle 的依赖项。

希望有帮助。

于 2013-05-28T13:30:26.153 回答