Symfony2 - 我的服务未注册

时间:2013-08-05 10:19:18

标签: symfony service dependency-injection

当然是一件愚蠢的事,但我无法从MyService注册MyBundle

SRC / ME / MyBundle /

$ ls -R src/Me/MyBundle/

DependencyInjection/
    MeMyBundleExtension.php
    Configuration.php
Resources/
    config/
        services.yml
Services/
    MyService.php
MyBundle.php

SRC / ME / MyBundle / DependencyInjection / MeMyBundleExtension.php

namespace Me\MyBundle\DependencyInjection;

// standard stuff

class MeMyBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        // standard stuff loading the yml file
    }
}

SRC / ME / MyBundle / DependencyInjection /的configuration.php

namespace Me\MyBundle\DependencyInjection;

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

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('my_services');

        return $treeBuilder;
    }
}

SRC / ME / MyBundle /资源/配置/ services.yml

services:
    me.myservice:
        class: Me\MyBundle\Services\MyService

SRC / ME / MyBundle /服务/ MyService.php

namespace Me\MyBundle\Services;

class MyService
{
    public function __construct()
    {
        die('test');
    }
}

当我尝试从控制器

实例化时,我可以看到我的服务未注册
$test = $this->get('me.myservice');
  

您已请求不存在的服务“me.myservice”

这里有什么问题吗?


$ php app/console container:debug | grep me.mybundle

没有匹配

2 个答案:

答案 0 :(得分:2)

<强> SRC / ME / MyBundle /资源/配置/ services.yml

services:
    me.myservice:
        class: Me\MyBundle\Services\MyService.yml

这应该引用一个类而不是一个yml文件。所以它应该是class: Me\MyBundle\Services\MyService

您还应该检查名称空间。如果你的包不是子包(getParent('SonataUserBundle')),你应该将你的类放在你自己的命名空间中。

<强> SRC / ME / MyBundle /服务/ MyService.php

namespace Me\MyBundle\Services;

<强> SRC / ME / MyBundle / DependencyInjection /的configuration.php

namespace Me\MyBundle\DependencyInjection;

根据symfony的命名策略,您的MyBundle.php也应MeMyBundle.php

答案 1 :(得分:0)

有一个自动映射事件,其中扩展类名称是从包名称派生的。我不久前遇到了麻烦。所以我通常只是在Bundle类中明确指定扩展名。类似的东西:

namespace Cerad\Bundle\AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

use Cerad\Bundle\AppBundle\DependencyInjection\AppExtension;

class CeradAppBundle extends Bundle
{
    public function getContainerExtension()
    {
        return new AppExtension();
    }
}