Sonata管理员+依赖注入

时间:2017-11-03 11:05:31

标签: php symfony dependency-injection sonata-admin

我正在努力使用奏鸣曲管理员和依赖注入。我定义了一个Admin类,并使用自己的控制器为它扩展CRUDController。

在此Controller中,我必须执行HTTP请求,因此我想注入Zend HTTP Client实例。

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

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

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

所以我认为我必须将直接类名作为管理服务的第3个参数替换为来自控制器容器服务的id我定义为" news.controller"。现在看起来像

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中定义的entitymanager ...

我还读到将控制器定义为服务并不是最好的方法......但是如果我确实需要它,那么如何使用zend客户端等外部客户端进行http调用的正确方法呢?

1 个答案:

答案 0 :(得分:1)

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

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

gulp.task('task one', () => {  
    return gulp.src([Dir + "**/*.css"])
        .pipe(concat(outFilename + ".css"))
        .pipe(gulp.dest(destDir));
});

很多括号但很好。