Sonata 管理控制器 + 依赖注入

Sonata admin controller + dependency injection

我正在为 sonata admin 和依赖注入而苦苦挣扎。我定义了一个 Admin class 并使用自己的控制器扩展 CRUDController 。

在这个控制器中我必须做一个 HTTP 请求,所以我想注入一个 Zend HTTP 客户端实例。

news.controller:
    class: MyBundle\Controller\NewsController
    arguments: ['@zend.httpclient']

news.admin
    class: MyBundle\Admin\NewsAdmin
    ...
    arguments:
       - null
       - MyBundle\Entity\News
       - MyBundle:News

从未注入来自新闻控制器的参数。我认为这是因为管理员不关心我的自定义控制器作为服务。

所以我想我必须用我定义为 "news.controller" 的控制器容器服务的 ID 替换直接 class 名称作为管理服务的第三个参数。现在看起来像

news.admin
    class: MyBundle\Admin\NewsAdmin
    ...
    arguments:
       - null
       - MyBundle\Entity\News
       - news.controller

现在我明白了

Call to a member function has() on null

我想,一定是少了什么配置……怎么了?

有人知道如何将东西注入自定义 CRUDController 并将其与 sonata admin 一起使用吗?或者我怎样才能以另一种方式做到这一点?我需要 CRUDController 因为我为来自自定义模板的几个 AJAX 调用定义了一个 api ... 所以还需要有一个在 CRUDController 中定义的实体管理器 ...

我还读到,将控制器定义为服务并不是最好的方法......但是如果我真的需要它们,那么与外部客户端(例如 zend 客户端)进行 http 调用的正确方法是什么?

has() 错误表示虽然您的控制器现在已正确连接为服务,但尚未注入容器。这种注入通常由控制器解析器在创建新控制器后完成 class。但是从容器中拉取controller时不执行此步骤。

解决方案是通过您的服务定义注入容器:

news.controller:
    class: MyBundle\Controller\NewsController
    arguments: ['@zend.httpclient']
    calls:[['setContainer', ['@service_container']]]

很多括号,但是很好。