在Symfony控制器中的教条问题

在Symfony控制器中的教条问题

问题描述:

我有一个错误,我找不到解决方案。我有一个司机的Symfony这样的:在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类类具有与学说做:

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

我不明白发生了什么,我使用和扩展控制器,所以你应该能够访问主义没有任何错误......在其他C ontrollers使用主义没有重大问题。

任何解决方案?

非常感谢。

+0

你如何传递一个doctrine引用到你的类datacontroller?你可以发布datacontroller类的代码吗? – Matteo 2015-04-01 10:53:26

+0

代码DataController类已启动。我不以任何方式引用Doctrine,是不是你认为如果扩展一个Controller类的类可以直接访问容器依赖关系,那么Doc​​trine? – JSGarcia 2015-04-01 11:00:16

这是因为您创建类的实例的方式。一个常规的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(); 

了适当的方式做,这是define your Controller as a service,注入Doctrine到它,并通过

得到它
$dataController = $this->container->get('your_data_controller_class'); 

重要注意事项:其他的事情是,控制器意味着要采取Request和r eturn Response对象,在你的情况下,你正在返回一个不好的数组。您应该将此逻辑移到Controller类之外的某个位置 - 类似UserManager类。那么你应该将这个UserManager定义为服务,注入Doctrine,在那里做你的逻辑并返回数据(一个数组)。在你的控制器中,你应该调用这个服务。

这样你将得到更干净的代码并将控制器外部的逻辑移动。

+0

谢谢,我试着直接在课堂上设置容器,它工作。我会阅读你通过我的链接,尽可能正确地做到这一点。谢谢! – JSGarcia 2015-04-01 11:13:32