当然是一件愚蠢的事,但我无法从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
没有匹配
答案 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();
}
}