【问题标题】:How to access the service container in order to use JMSSerializer?如何访问服务容器以使用 JMSSerializer?
【发布时间】:2012-11-09 16:11:23
【问题描述】:

根据文档:

容器在任何传统的 Symfony2 控制器中都可用,您可以通过 get() 快捷方式访问容器的服务

所以,我设法通过调用在 Controller 中调用和使用 JMSSerializer:

$serializer = $this->get('serializer');

但是,如何在自定义类中调用容器?相同的命令失败,指示调用未定义方法 get() 的致命错误。

【问题讨论】:

  • 您能稍微扩展一下“自定义类”的含义吗?该类是否有权访问服务容器?
  • 假设我想在我的包中创建一个使用 JMSSerializer 的类。如何让它能够访问服务容器?

标签: symfony jmsserializerbundle


【解决方案1】:

这正是依赖注入的用途。您的“自定义类”依赖于“序列化程序”服务。因此,您应该将您的类定义为服务容器中的服务

app/config/config.yml

services:
    my_custom_class:
        class:        My\RandomBundle\CustomClass
        arguments:    [serializer]

My\RandomBundle\CustomClass

use JMS\SerializerBundle\Serializer\Serializer;

class CustomClass
{
    private serializer;

    public function __construct(Serializer $serializer)
    {
        $this->serializer = $serializer;
    }
}

现在您可以从容器中获取您的自定义类,无论它在哪里使用,它都会自动获得可用的序列化程序。

$myServiceWithASerializer = $this->container->get('my_custom_class');

文档也对此进行了描述:
http://symfony.com/doc/current/book/service_container.html#creating-configuring-services-in-the-container

【讨论】:

  • 感谢您的回复。我理解上述概念,但我实际上并没有很好地描述我的问题。如果我在控制器中,我可以使用示例中的 $serializer = $this->get('serializer') 或 $myServiceWithASerializer = $this->container->get('my_custom_class') 并开始使用 JMSSerializer。但是,如果我在我的包中创建一个不同的类(即 MyClass),我该如何调用此服务?
  • 这将是相同的概念。您要么需要在每次构建 MyClass 时传入序列化程序,要么将其定义为服务,以便自动完成。
  • 我的问题仍然没有得到解答。当我拨打电话时: $myServiceWithASerializer = $this->container->get('my_custom_class');我收到 $container 变量的未定义属性警告。我在我的包中某个随机类的函数中调用它。我在这里错过了什么?
  • 没有魔法。如果你不定义 $this->container 那么它就不会存在。我只是用它作为例子。关键是,您不会将整个服务容器传递给您的自定义类。您使用 DIC 来定义您的类依赖项,然后当您想要使用您的类时,您可以从 DIC 中获取它们。 symfony.com/doc/current/book/service_container.html
  • 我实例化容器并尝试调用我的服务:$container = new Container(); $serializer = $container->get('my_custom_class');但我明白了:您请求了一个不存在的服务“my_custom_class”。我的错误是什么?
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 2011-11-15
  • 1970-01-01
  • 2020-10-28
  • 2023-03-07
相关资源
最近更新 更多