2017-06-08 164 views
1

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

我控制器从基本的Symfony控制器,它具有ContainerAwareTrait延伸,但是当我尝试做$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): 
    } 
} 
+0

添加通话您是否将控制器定义为服务?或者您是否使用标准路由机制? – Cerad

+0

您是否试图自己实例化控制器(例如'$ controller = new MyController();')? – ccKep

+0

请向我们展示控制器代码。 –

回答

2

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

这些都是有罪线:

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

我有类似的问题,除了我用DIC注入服务我的控制器。是否没有办法让DI和$ this->容器可用? 我正在尝试使用FOS User Bundle,但没有访问容器,我正在努力查看如何使用它 – Xopa

0

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

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

Downvoter,有什么问题的答案? – kRicha

+0

没有downvote你,但这是我正在尝试做的,并且不起作用 – ChypRiotE

+0

@ChypRiotE是从Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller'扩展的控制器,如果是的话使用后会出现什么错误'$ this-> get('security.token_storage')'在你的控制器的操作中? – kRicha

1

尝试setContainer方法的控制器:

在你的控制器在service.yml

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