我遇到一个错误,无法找到解决方案。我有一个 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;
}
}
正如所见,当我调用任何方法时,仅返回使用 Doctrine 的用户列表,如下所示:
$users = new DataController();
$listOfUsers = $users->listOfUsers()
DataController 类中出现与 Doctrine 有关的异常:
Error: Call to a member function has() on a non-object
我不明白发生了什么,我正在使用和扩展 Controller ,因此您应该能够访问 Doctrine 而不会出现任何错误...在其他 Controller 中使用 Doctrine 不会出现重大问题。
有什么解决办法吗?
非常感谢。
最佳答案
这是因为您创建类实例的方式。常规的 symfony Controller 实例由服务容器
创建,并在其上调用setContainer
方法。您的 DataController 类不了解容器,这就是您收到错误的原因(您不能只执行 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
注入(inject)其中并通过
$dataController = $this->container->get('your_data_controller_class');
重要说明:另一件事是 Controller 应该接受 Request
并返回 Response
对象,在您的情况下,您返回一个数组这不好。您应该将此逻辑移至 Controller 类之外的某个位置 - 例如 UserManager
类。然后,您应该将此 UserManager 定义为服务,注入(inject) Doctrine,在那里执行逻辑并返回数据(数组)。与您的 Controller 相比,您应该调用此服务。
这样您将获得更清晰的代码并将逻辑移至 Controller 之外。
关于php - Symfony Controller 中的 Doctrine 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388456/