Symfony 控制器中的学说问题

Problems with doctrine in Symfony controller

我有一个错误,我找不到解决办法。我有一个驱动程序 Symfony 这个:

<?php

namespace Consolidador\PanelBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DataController extends Controller
{

    public function listOfUsers()
    {
        $em = $this->getDoctrine()->getManager();
        $settings = $em->getRepository('PanelBundle:Users')->findAll();

        return $settings;

    }

}

只看到 returns 使用 Doctrine 的用户列表,当我调用任何方法时,就像这样:

    $users = new DataController();
    $listOfUsers = $users->listOfUsers()

DataController class 中出现与 Doctrine 有关的异常:

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

我不明白发生了什么,我正在使用和扩展控制器,所以你应该能够毫无错误地访问 Doctrine ...在其他控制器中使用 Doctrine 没有重大问题。

有什么解决办法吗?

非常感谢。

这是因为您创建实例的方式 class。一个常规的 symfony 控制器实例由 service container 创建,它调用 setContainer 方法。您的 DataController class 不了解容器,这就是您收到错误的原因(您不能只做 new DataController())。

一种快速且 肮脏 的解决方法是在您的 DataController 实例上设置容器:

$users = new DataController();
$users->setContainer($container); //you need to have container available, I don't know what context are you in
$listOfUsers = $users->listOfUsers();

一个正确的方法是define your Controller as a service,将Doctrine注入其中并通过

获取它
$dataController = $this->container->get('your_data_controller_class');

重要说明:另一件事是 Controller 是为了接受 Request 和 return Response 对象,在你的情况下你return 是一个不好的数组。您应该将此逻辑移动到 Controller class 之外的某个位置 - 类似于 UserManager class。然后你应该将这个UserManager定义为一个服务,注入Doctrine,在那里做你的逻辑和return数据(一个数组)。比在你的控制器中你应该调用这个服务。

这样您将获得更清晰的代码并将逻辑移到控制器之外。