Symfony控制器中的原理问题



我有一个错误,找不到解决方案。我有一个司机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,在那里执行逻辑并返回数据(一个数组)。在您的控制器中,您应该调用此服务。

通过这种方式,您将获得更干净的代码,并将逻辑移到控制器之外。

相关内容

  • 没有找到相关文章

最新更新