【问题标题】:symfony2: service access in controller throws exception - "Error: Call to a member function get() on a non-object"symfony2:控制器中的服务访问引发异常 - “错误:调用非对象上的成员函数 get()”
【发布时间】:2014-07-03 18:33:03
【问题描述】:

我在src\trollmaster\TrollBundle\Services\DefaultService.php做了服务

namespace trollmaster\TrollBundle\DefaultService;

class DefaultService
{
    protected $example;

    protected function exampleFunction()
    {
        return null;
    }
}

我的资源\config\services.yml:

services:
    trollmaster.default_service:
        class: trollmaster\TrollBundle\DefaultService

并且命令php app/console container:debug 正确返回了我的服务名称,但是当我想在控制器的构造中调用此服务时:

$this->DefaultService = $this->get("trollmaster.default_service");

我看到了这个错误:

Error: Call to a member function get() on a non-object

我做错了什么?


编辑:

当我想将控制器定义为服务时

/**
 * @Route(service="DefaultController")
 */
class DefaultController

我收到错误:

ClassNotFoundException: Attempted to load class "DefaultController" from namespace "trollmaster\TrollBundle

【问题讨论】:

  • 您的控制器是否扩展了控制器类?就是那个类有get 方法
  • 你想达到什么目的?
  • 只在Controller中访问我的服务:$this->DefaultService.

标签: php symfony service dependency-injection


【解决方案1】:

原因是容器被注入到实现ContainerAwareInterface的控制器中

...(即通过扩展Symfony\Bundle\FrameworkBundle\Controller\Controller)...

...通过setter-injection


TLDR: setter-injection 对象被构造之后执行。

因此你无法做到……

$service = $this->get('service');
// ... or ...
$service = $this->container->('service');

...在__construct() 方法内,因为setContainer() 方法未被调用且$this->container 尚未设置。

您可以在 documentation 中阅读有关不同类型注入的更多信息。


查看以下代码部分:

  • Controller 扩展ContainerAware here

  • ContainerAware提供setContainer()方法here

【讨论】:

  • 所以我可以简单地调用$this->DefaultService = $this->get("trollmaster.default_service");,例如在 indexAction() 方法中:)
  • 是的,甚至更好:不要扩展Controller,而是将控制器类显式配置为服务-然后将所有其他服务依赖项中的trollmaster.default_service 直接注入构造函数。 (正如马库斯建议的那样)
  • 那么,exampleController 与 exampleAction 和 exampleService 与 exampleMethod 应该如何?我有一些小问题要让它正确:(
【解决方案2】:

这是因为构造函数不知道容器(就像 nifr 解释的那样。)。但是你可以define your controller itself as a service。我想这将是最佳实践,虽然我不知道你想要达到什么目的。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多