依赖注入 - Symfony(没有扩展能够加载 "acme_api.question_manager" 的配置(在 ../Resources/config/services.yml 中)

Dependency Injection - Symfony (There is no extension able to load the config for "acme_api.question_manager" (in ../Resources/config/services.yml)

在 symfony2 中使用 DI 设置新服务时出现此错误 我正在使用 symfony2.3 并使用 fos-rest bundle 来创建 json API's

DependencyInjection/Configuration.php

<?php

namespace Acme\ApiBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * This is the class that validates and merges configuration from your     app/config files
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
 */
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritDoc}
     *
     * @return TreeBuilder
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $treeBuilder->root('acmeapi');


        // Here you should define the parameters that are allowed to
        // configure your bundle. See the documentation linked above for
        // more information on that topic.

        return $treeBuilder;
    }
}

DependencyInjection/AcmeApiExtension.php

<?php

namespace Acme\ApiBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Config\FileLocator;

class AcmeApiExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        //$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        //$loader->load('services.xml');

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }

    public function getAlias()
    {
        return 'acme_api';
    }
}

还有我的Resources/config/services.yml

parameters: 
    # Overriding Security Bundle's Access Listener class to provide  detailed
    # error message
services:
acme_api.question_manager:
    class: AcmeApiBundle\Manager\QuestionManager
    arguments:
      - @doctrine
      - @validator

最后 app/confog/config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: @AcmeApiBundle/Resources/config/services.yml }
.......

此外,添加应用内核文件

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new Acme\ApiBundle\AcmeApiBundle(),
            new JMS\SerializerBundle\JMSSerializerBundle(),
            new FOS\RestBundle\FOSRestBundle(),
        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    { 
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

如果需要更多数据点,请告诉我,以便在这里提供帮助。

您正在混合 config.yml 和 services.yml。第一个包含捆绑配置,第二个包含服务和参数。

services.yml 已经在 class AcmeApiExtension$loader->load('services.yml'); 中加载,因此无需再次加载它:

- { resource: @AcmeApiBundle/Resources/config/services.yml }.

(加载带有扩展的服务是最常见的捆绑方式)。有关更多信息,请查看:http://symfony.com/doc/current/book/service_container.html#importing-other-container-configuration-resources

services.yml 中也存在格式错误。正确一个:

parameters: 
    # Overriding Security Bundle's Access Listener class to provide  detailed
    # error message
services:
    acme_api.question_manager:
        class: AcmeApiBundle\Manager\QuestionManager
        arguments:
          - @doctrine
          - @validator

(最后 5 行缩进)。这会导致 "No extension" 错误。