Контейнер Dependecy Injection не работает в Fixtures после обновления symfony 2.0 до 2.1 / 2.2

Я обновил проект с Symfony 2.0 до 2.1. После этого мои тесты перестали работать. Проблема в том, что я использую приборы, которые реализуют интерфейс ContainerAware. Теперь после обновления метод setContainer () больше не вызывается. Я попробовал модернизировать дальше до 2.2. Проблема все еще сохраняется.

composer.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" } } 

}

и мой светильник выглядит так:

LoadUserData.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) { [...] } } 

Я уже рассмотрел приборы Doctrine, которые не работают после обновления до Symfony 2.1.8, но это не решает мою проблему.

Я действительно с нетерпением жду вашего вклада, поскольку я пытался это решить довольно долгое время.

    У меня была точно такая же проблема, ничто не исправило бы ее, изменив круглый порядок композитора, порядок в ядре, расширение или реализацию и т. Д., Поэтому, в конце концов, я просто передаю контейнер из теста:

     public function testLogin() { /// $fixture = new UserFixtures(); $fixture->setContainer($container); /// $executor->execute($loader->getFixtures(), true); 

    И теперь это прекрасно работает.

    Решение:

    Убедитесь, что вы не только реализуете ContainerAwareInterface – вам следует расширить ContainerAware

     use Symfony\Component\DependencyInjection\ContainerAware; // ContainerAware... already implements ContainerAwareInterface class YourFixture extends ContainerAware { // ... 

    Еще одно предложение :

    Переместите Datafixtures дальше в свой composer.json (до doctrine / orm), чтобы композитор правильно сгенерировал карту классов.

    В документации 2.0 .

    Обязательно зарегистрируйте новое пространство имен до Doctrine \ Common. В противном случае Symfony будет искать классы данных в каталоге Doctrine \ Common. Автозагрузчик Symfony всегда ищет класс внутри каталога первого совпадающего пространства имен, поэтому более конкретные пространства имен всегда должны быть первыми.

    Кроме того, вам не нужны светильники – комплекты и крепления, поскольку светильники – это зависимость набора светильников.

    Надеюсь, это поможет.