php - Symfony Controller 中的 Doctrine 问题

标签 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 有关的异常:

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/

相关文章:

php - MP4 在直接访问时播放,但在 iOS 上通过 PHP 读取时不播放

php - 如何启动一个新的大型 ZF2 项目?

validation - 有没有办法在 Symfony 中验证 ISO8601 日期?

forms - 为什么我的选择字段仍然是必需的?

php - Gedmo Timestampable(更新创建时)

php - 数据映射器模式、文件上传和原则 2 的单一责任原则

php - Symfony2 查找重复行并对另一列求和

php - 将单词转换为字典顺序的数字

php - 我可以从 PHP 5.3.10 迁移到 PHP 5.6.0 吗?

php - 将 Symfony\Console 用于交互式 php cli 应用程序