gpt4 book ai didi

php - Symfony2 - 如何在 Controller 中使用 __construct() 并访问 Securty.Context?

转载 作者:IT王子 更新时间:2023-10-29 00:07:36 24 4
gpt4 key购买 nike

我在使用 Symfony2 时遇到了一些问题。即如何使用 __construct() 函数。官方文档非常糟糕!

我希望能够使用以下内容:

public function __construct()
{
parent::__construct();
$user = $this->get('security.context')->getToken()->getUser();
}

我怎么会得到以下错误:

Fatal error: Cannot call constructor in /Sites/src/DEMO/DemoBundle/Controller/Frontend/HomeController.php on line 11

第 11 行是“parent::__construct();”

我删除它并得到以下新错误

Fatal error: Call to a member function get() on a non-object in /Sites/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 242

认为我可能需要设置 ContainerInterface DIC,但我不知道该怎么做(我试过但失败了,很惨)

有什么想法吗?

更新 - 尝试更改以扩展 ContainerAware 并收到此错误:

Fatal error: Class DEMO\DemoBundle\Controller\Frontend\HomeController cannot extend from interface Symfony\Component\DependencyInjection\ContainerAwareInterface in /Sites/src/DEMO/DemoBundle/Controller/Frontend/HomeController.php on line 43

在 Controller 中使用以下代码:

<?php

namespace DEMO\DemoBundle\Controller\Frontend;

use Symfony\Component\DependencyInjection\ContainerAware;

class HomeController extends ContainerAwareInterface
{
protected $container;

public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}

最佳答案

我假设您正在扩展默认的 Symfony Controller ?如果是这样,看看代码就会找到答案:

namespace Symfony\Bundle\FrameworkBundle\Controller;

use Symfony\Component\DependencyInjection\ContainerAware;

class Controller extends ContainerAware
{

请注意,没有定义 Controller::__construct,因此使用 parent::__construct 将无济于事。如果我们看看 ContainerAware:

namespace Symfony\Component\DependencyInjection;

class ContainerAware implements ContainerAwareInterface
{
protected $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
}

同样,在调用 setContainer 之前,没有构造函数并且容器不可用。所以覆盖 setContainer 并将你的逻辑放在那里。或者只是制作一个不扩展基本 Controller 类的独立 Controller ,并将您的依赖项直接注入(inject)构造函数。

2017 年 8 月更新

仍然有一些点击率。如果您真的想在每个 Controller 之前执行某些操作,请使用内核 Controller 监听器。如果您只需要用户,那么当然可以使用 getUser()。并且请不要覆盖 setContainer()。在某些情况下,它可以工作,但只会使您的代码复杂化。

关于php - Symfony2 - 如何在 Controller 中使用 __construct() 并访问 Securty.Context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com