Symfony 在控制器内调用控制器

Symfony 在控制器内调用控制器,symfony,Symfony,为什么在控制器内部调用控制器时会出现以下错误 致命错误:对中的非对象调用成员函数get() /home/web/project/symfony2/vendor/symfony/src/symfony/Bundle/FrameworkBundle/Controller/Controller.php 在线149 在控制器中,我调用了一个扩展controller的类: class DemoController extends Controller { public function index

为什么在控制器内部调用控制器时会出现以下错误

致命错误:对中的非对象调用成员函数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
调用控制器内的服务、条令或其他类似内容时,发生了错误。否则,它会起作用

例如,我如何在这个类中使用条令?

试试看

$object->setContainer($this->container);
调用
method()

编辑: 基本上,让服务扩展
控制器是个坏主意,但是如果你真的需要这样做,试着添加这个

your.service:
  class: Your\Class
  arguments: [...]
  calls:
    - [ setContainer, [@service_container] ]
在您的服务配置文件中(可能是
service.yml

试试看

$object->setContainer($this->container);
调用
method()

编辑: 基本上,让服务扩展
控制器是个坏主意,但是如果你真的需要这样做,试着添加这个

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

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

谢谢。它起作用了。有什么办法吗?特别是在课堂上解决问题。因为,我将在很多地方使用这个课程(作为一种服务),这将是重复的。你太棒了。请您很快告诉我为什么这是个坏主意好吗?
Controller
类是为路由目标(操作)而设计的,但您将其作为一种服务使用。你到底为什么要这么做?
Controller
类中的每个函数基本上都是不同服务的包装器,例如
Controller::get()
,它是
$this->container->get()的快捷方式。因此,通过在您的服务中注入服务容器(
参数:[@service\u container]
),您可以在不扩展
Controller
的情况下执行相同的操作。为了跟进@prehfeldt的出色响应,您应该做的是只注入服务完成其工作所需的服务。需要实体经理吗?然后注入实体管理器。很少有服务需要访问容器中的所有内容。谢谢。它起作用了。有什么办法吗?特别是在课堂上解决问题。因为,我将在很多地方使用这个课程(作为一种服务),这将是重复的。你太棒了。请您很快告诉我为什么这是个坏主意好吗?
Controller
类是为路由目标(操作)而设计的,但您将其作为一种服务使用。你到底为什么要这么做?
Controller
类中的每个函数基本上都是不同服务的包装器,例如
Controller::get()
,它是
$this->container->get()的快捷方式。因此,通过在您的服务中注入服务容器(
参数:[@service\u container]
),您可以在不扩展
Controller
的情况下执行相同的操作。为了跟进@prehfeldt的出色响应,您应该做的是只注入服务完成其工作所需的服务。需要实体经理吗?然后注入实体管理器。很少有服务需要访问容器中的所有内容。