2013-05-28 2 views
1

Я обновил проект от Symfony 2.0 до 2.1. После этого мои тесты перестали работать. Проблема в том, что я использую приборы, которые реализуют интерфейс ContainerAware. Теперь после обновления метод setContainer() больше не вызывается. Я попробовал модернизировать дальше до 2.2. Проблема все еще сохраняется.Контейнер Dependecy Injection не работает в Fixtures после обновления Symfony 2.0 до 2.1/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 fixtures not working after updating to Symfony 2.1.8 но это не решает мою проблему.

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

+0

Это инъекция не происходит или весь прибор не загружен? – nifr

ответ

-2

Решение:

Убедитесь, что вы не только реализовать ContainerAwareInterface - вы должны продлить ContainerAware

use Symfony\Component\DependencyInjection\ContainerAware; 

// ContainerAware... already implements ContainerAwareInterface 

class YourFixture extends ContainerAware 
{ 
    // ... 

Другое предложение:

Move Datafixtures дальше в вашем композитора. json (до учения/orm), чтобы композитор генерировал classmap corr ectly.

Состояние 2.0 documentation.

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

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

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

+0

Спасибо за помощь! Я редактировал composer.json, как вы предлагали, и выполнял обновление композитора. К сожалению, setContainer по-прежнему не называется. – motteneder

+0

обновил мой ответ ... вы забыли продлить ContainerAware :) – nifr

2

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

public function testLogin() 
{ 

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

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

И теперь он отлично работает.