我无法访问控制器中的容器

2024-01-26

我正在尝试访问 Symfony 控制器中的服务

$session = $this->get('session');

但我收到下一个错误:

PHP Fatal error: Call to a member function get() on a non-object

我认为 Symfony2 默认将控制器定义为服务。

注:这个问题最初是由Dbugger https://stackoverflow.com/users/392684/dbugger,但他无缘无故地删除了它,而它已经得到了答复。


在控制器中使用容器

get()只是提供的一个快捷功能Symfony 基本控制器类 http://api.symfony.com/master/Symfony/Bundle/FrameworkBundle/Controller/Controller.html来访问容器。

您的控制器必须扩展此类才能使用此函数:

namespace Acme\ExampleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    // your actions
}

如果你不想依赖这个类(由于某些原因)你可以扩展ContainerAware http://api.symfony.com/master/Symfony/Component/DependencyInjection/ContainerAware.html注入容器并像在中一样使用它get() https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php#L250捷径:

namespace Acme\ExampleBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;

class DefaultController extends ContainerAware
{
    public function exampleAction()
    {
        $myService = $this->container->get('my_service');

        // do something
    }
}

自己创建控制器

控制器默认不定义为服务,您可以定义它们,但不需要获取容器。如果发出请求,路由框架会确定需要调用的控制器。然后控制器被构建并通过容器注入setContainer() https://github.com/symfony/symfony/blob/master/src/Symfony/Component/DependencyInjection/ContainerAware.php#L37 method.

但是,如果您自己构建控制器(在测试中或其他任何地方),则必须自己注入容器。

$controller = new DefaultController();
$controller->setContainer($container);
// $container comes trough DI or anything else.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我无法访问控制器中的容器 的相关文章

随机推荐