Php Symfony:无法访问捆绑构造函数中的服务

Php Symfony:无法访问捆绑构造函数中的服务,php,symfony,bundle,symfony-2.3,Php,Symfony,Bundle,Symfony 2.3,如何访问包构造函数中的服务?我正在尝试创建一个系统,其中主题包可以自动向主题服务注册,请参见下面的小示例(解决方案越简单越好): 试着让它工作:): 试着让它工作:): 您无法访问服务容器是正常的,因为服务尚未编译。 要将带标签的服务注入到该捆绑包中,您需要创建一个新的编译器过程 要创建编译器过程,它需要实现CompilerPassInterface 将该类放入捆绑包的DependencyInjection/Compiler文件夹中 use Symfony\Component\Dependenc

如何访问包构造函数中的服务?我正在尝试创建一个系统,其中主题包可以自动向主题服务注册,请参见下面的小示例(解决方案越简单越好):

试着让它工作:):

试着让它工作:):


您无法访问服务容器是正常的,因为服务尚未编译。
要将带标签的服务注入到该捆绑包中,您需要创建一个新的编译器过程

要创建编译器过程,它需要实现CompilerPassInterface

将该类放入捆绑包的DependencyInjection/Compiler文件夹中

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CustomCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        if ($container->has('organization.themes')) {
            $container->getDefinition('organization.themes')->addMethodCall('register', array(new Organization\Theme\BasicBundle\Entity\Theme(__DIR__)));
        }
    }
}
然后重写bundle定义类的build方法

class ThemeBasicBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new CustomCompilerPass());
    }
}
一些链接:


您无法访问服务容器是正常的,因为服务尚未编译。 要将带标签的服务注入到该捆绑包中,您需要创建一个新的编译器过程

要创建编译器过程,它需要实现CompilerPassInterface

将该类放入捆绑包的DependencyInjection/Compiler文件夹中

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CustomCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        if ($container->has('organization.themes')) {
            $container->getDefinition('organization.themes')->addMethodCall('register', array(new Organization\Theme\BasicBundle\Entity\Theme(__DIR__)));
        }
    }
}
然后重写bundle定义类的build方法

class ThemeBasicBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new CustomCompilerPass());
    }
}
一些链接:


这可以用来获取服务,但当我试图从控制器获取在CompilerPass类中设置的值时,服务属性重置有问题,从控制器获取服务时,我似乎得到了该类的另一个实例。我想做的是在包实例化时注册主题实例,然后从控制器访问主题实例。为什么要重置服务类属性?@t在查看我的编辑时,您需要获取服务定义并使用addMethodCall方法。这可用于获取服务,但当我尝试从控制器获取在CompilerPass类中设置的值时,我在重置服务属性时遇到问题,从控制器获取服务时,我似乎得到了该类的另一个实例。我想做的是在包实例化时注册主题实例,然后从控制器访问主题实例。为什么要重置服务类属性?@t在查看我的编辑时,您需要获取服务定义并使用addMethodCall方法。当我尝试此操作时,出现一个错误,说明找不到服务“organization.themes”。当我尝试此操作时,出现一个错误,说明服务“organization.themes”找不到。生成容器后将执行Bundle::boot。哪种回答你的问题。但是,在构建阶段这样做是正确的方法。哪种回答你的问题。然而,在构建阶段这样做是正确的方法。
class ThemeBasicBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new CustomCompilerPass());
    }
}