2016-02-02 57 views
0

在我的每個控制器上,我需要從構造函數運行安全性強制函數。問題是我無法在構造函數中運行doctrine實體管理器以從會話中加載用戶標識,並在我的用戶實體上調用findby函數。 我發現的唯一方法是在我的每個動作上調用這個安全強制函數,這不是最優的 - 代碼不乾淨,以及大量的函數調用。 我已經搜索並測試了很多來自於stackoverflow的用戶解決方案 - 其中許多是複製粘貼其他人不工作的代碼。 我services.yml文件:Symfony2傳遞給構造函數實體管理器拋出錯誤

services: 
    app.default_controller: 
     class: AppBundle\Controller\DefaultController 
     arguments: 
      - @doctrine.orm.entity_manager 

我DefaultController類(其採樣控制器):

<?php 

namespace AppBundle\Controller; 
use Doctrine\ORM\EntityManager; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

class DefaultController extends Controller 
{ 
    protected $em; 
    /** 
    * @Route("/", name="homepage") 
    */ 
    public function indexAction(Request $request) 
    { 
     // replace this example code with whatever you need 
     return $this->render('default/index.html.twig', array(
      'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..'), 
     )); 
    } 

    public function __construct(EntityManager $em = null){ 
     $this->em=$em; 

     $personRepository = $this->getDoctrine()->getManager()->getRepository('AppBundle\Entity\Person'); 
     //$em = $this->getDoctrine()->getManager(); 

    } 
} 

我總是有原則錯誤不管我不是構造函數來完成。 Often error example, when im trying to access website

PS。我正在使用Symfony 2.8.2,此代碼示例不是來自實際應用程序

回答

0

請允許我建議一種不同的方法。你最好使用symfony事件系統:)

你可以設置偵聽器在控制器的任何動作之前和之後執行。

只需標記要訂閱的事件並將它們分發給您爲安全目的而創建的服務。

對此How to Set Up Before and After Filters

好運結帳symfony的文檔! :)