【问题标题】:Calling controller inside a controller在控制器内部调用控制器
【发布时间】:2012-05-23 08:05:07
【问题描述】:

为什么在控制器内部调用控制器会报如下错误?

致命错误:在非对象上调用成员函数 get() /home/web/project/symfony2/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 在第 149 行

在控制器中,我调用了一个扩展 Controller 的类:

class DemoController extends Controller
{
    public function indexAction()
    {
        $object = new \Acme\DemoBundle\Service\Object();
        $object->method();
    }
    // ...
}

类是这样的:

# Acme/DemoBundle/Service/Object.php
class Object extends Controller
{
    public function method()
    {
        $em = $this->getDoctrine()->getEntityManager(); // the problem
        // ...
    }
}

当我在控制器中使用$this 调用服务、原则或其他类似内容时,发生了错误。否则,它可以工作。

例如,我如何在此类中使用教义?

【问题讨论】:

    标签: symfony


    【解决方案1】:

    试试

    $object->setContainer($this->container);
    

    在您致电method()之前

    编辑: 基本上,让服务扩展 Controller 是个坏主意,但如果您真的需要这样做,请尝试添加它

    your.service:
      class: Your\Class
      arguments: [...]
      calls:
        - [ setContainer, [@service_container] ]
    

    在您的服务配置文件中(可能是service.yml

    【讨论】:

    • 谢谢。有用。有什么办法吗?尤其是解决课堂内的问题。因为,我将在很多地方使用课程(作为服务),这将是重复的。
    • 你很棒。能否请您简短地说一下为什么这是一个坏主意?
    • Controller 类是为路由目标(操作)而设计的,但您将其用作服务。你到底为什么要这样做? Controller 类中的每个函数基本上都是不同服务的包装器,例如Controller::get()$this->container->get() 的快捷方式。因此,通过在您的服务 (arguments: [@service_container]) 中注入服务容器,您可以在不扩展 Controller 的情况下做同样的事情。
    • 只是为了跟进@prehfeldt 的出色响应,您应该做的是只注入您的服务完成工作所需的那些服务。需要实体经理?然后注入实体管理器。很少有服务需要访问容器中的所有内容。
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2013-12-10
    • 2018-01-24
    • 2012-01-23
    • 1970-01-01
    • 2011-06-29
    • 2023-03-25
    相关资源
    最近更新 更多