【问题标题】:Symfony Controller unable to access containerSymfony 控制器无法访问容器
【发布时间】:2017-11-10 19:41:39
【问题描述】:

所以我已经完成了 Symfony 3 的新安装,尝试设置一些 API 路由,但我无法访问控制器内的容器。

我的控制器从具有ContainerAwareTrait 的基本 Symfony 控制器扩展而来,但是当我尝试执行 $this->container->get('service') 时,我收到了这个错误:

"message": "Call to a member function get() on null",
"class": "Component\\Debug\\Exception\\FatalThrowableError",
"trace": [{
    "namespace": "",
    "short_class": "",
    "class": "",
    "type": "",
    "function": "",
    "file": "src\\Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller.php",
    "line": 50,
    "args": []
}]

看起来 symfony 自己的控制器无法找到容器,是我遗漏了什么吗?

这是控制器的代码:

use FOS\RestBundle\Controller\Annotations\Get;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;

class UsersController extends Controller
{
    /**
     * @Get()
     *
     * @return JsonResponse
     */
    public function getUsersAction()
    {
        $users= $this->get('doctrine.orm.entity_manager')->getRepository('AppBundle:User')->findAll();

        return new JsonResponse($users, 200):
    }
}

【问题讨论】:

  • 你是把控制器定义为服务还是使用标准的路由机制?
  • 您是否尝试自己实例化控制器(例如$controller = new MyController();)?
  • 请给我们看控制器代码。
  • 编辑添加控制器的代码。我使用的是标准路由机制,我的控制器是从默认的 symfony 控制器扩展而来的。
  • 嗯。而这一切你都在做什么?没有构造函数?没有尝试将控制器定义为服务?不尝试运行单元测试?或者也许是一个控制台命令?一切似乎都很神秘。

标签: php symfony symfony-3.3


【解决方案1】:

终于找到答案也感谢@Cerad的评论: Symfony 3 的默认安装创建 services.yml 文件,并将每个控制器注册为服务。禁用它允许我的控制器访问容器。

这些是有罪的台词:

   AppBundle\Controller\:       
        resource: '../../src/AppBundle/Controller'      
        public: true        
        tags: ['controller.service_arguments']

【讨论】:

  • 我遇到了类似的问题,只是我使用 DIC 将服务注入到我的控制器中。有没有办法让 DI 和 $this->container 都可用?我正在尝试使用 FOS 用户包,但无法访问容器我正在努力了解如何使用它
【解决方案2】:

尝试在控制器上设置容器方法:

在你的控制器中添加调用 service.yml

 AppBundle\Controller\:
        resource: '../../src/YourBundle/YourController'
        public: true
        tags: ['controller.service_arguments']
        calls:
            - [setContainer, ["@service_container"]]

【讨论】:

    【解决方案3】:

    在控制器中,您可以在$this 上使用方法get() 访问容器,例如:

    $this->get('security.token_storage')
    

    【讨论】:

    • 没有对你投反对票,但这是我正在尝试做的,但不起作用
    • @ChypRiotE 是您的控制器从 Symfony\Bundle\FrameworkBundle\Controller\Controller 扩展而来,如果是,您在控制器中使用 $this->get('security.token_storage') 后会出现什么错误?
    • 是的,我正在从默认的 symfony 控制器扩展,我得到的错误是 Call to a member function get() on null
    • @ChypRiotE 你提到的问题,你正在尝试使用$this 的容器属性中的get 方法,我想说的是,你需要直接使用get 方法在$this.
    • $this->container->get$this->get 都试过了,但都返回相同的错误
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多