我有一个错误,我找不到解决方案。我有一个司机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有关的异常:
错误:在非对象上调用成员函数has()
我不明白发生了什么,我正在使用和扩展控制器,所以你应该能够在没有任何错误的情况下访问Doctrine ......在其他控制器中使用Doctrine而没有重大问题。
任何解决方案?
非常感谢。
答案 0 :(得分:4)
这是因为您创建类实例的方式。 service container
创建了一个常规的symfony控制器实例,该实例在其上调用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
注入其中并通过
$dataController = $this->container->get('your_data_controller_class');
重要提示:其他的一点是,控制器需要Request
,并返回Response
对象,在你的情况下,你返回一个不好的数组。您应该将此逻辑移到Controller类之外的某个位置 - 类似UserManager
类。然后,您应该将此UserManager
定义为服务,注入Doctrine
,在那里执行逻辑并返回数据(数组)。在您的控制器中,您应该拨打此服务。
通过这种方式,您将获得更清晰的代码并将逻辑移出控制器。