我有一个错误,找不到解决方案。我有一个司机Symfony这个:
<?php
namespace ConsolidadorPanelBundleController;
use SymfonyBundleFrameworkBundleControllerController;
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类中出现一个与条令有关的异常:
错误:在非对象上调用成员函数has()
我不明白会发生什么,我正在使用和扩展控制器,所以你应该能够访问Doctrine而不会出现任何错误。。。在其他控制器中,使用条令没有重大问题。
有什么解决方案吗?
非常感谢。
这是因为创建类实例的方式。一个常规的symfony控制器实例是由service container
创建的,它在上面调用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();
一个正确的方法是将您的控制器定义为一个服务,将Doctrine
注入其中并通过获取
$dataController = $this->container->get('your_data_controller_class');
重要提示:另一件事是,Controller要获取Request
,并返回Response
对象,在您的情况下,您返回的是一个不好的数组。您应该将这个逻辑移到Controller类之外的某个地方,比如UserManager
类。然后,您应该将这个UserManager
定义为一个服务,注入Doctrine
,在那里执行逻辑并返回数据(一个数组)。在您的控制器中,您应该调用此服务。
通过这种方式,您将获得更干净的代码,并将逻辑移到控制器之外。