Symfony控制器中的学说问题

时间:2015-04-01 10:30:04

标签: php symfony doctrine-orm doctrine

我有一个错误,我找不到解决方案。我有一个司机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而没有重大问题。

任何解决方案?

非常感谢。

1 个答案:

答案 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,在那里执行逻辑并返回数据(数组)。在您的控制器中,您应该拨打此服务。

通过这种方式,您将获得更清晰的代码并将逻辑移出控制器。