2012-06-24 24 views
8

Symfony2コントローラでコンストラクタを定義する方法を教えてください。私は、私のコントローラのすべてのメソッドで利用可能なログインユーザデータを取得したい、現在私はログインユーザを取得するために私のコントローラのすべてのアクションでこれを行う。あなたがイベントリスナーを添付することができ、すべてのコントローラのアクションの前にコードを実行するための一般的な解決のためにすべての私の行動Symfony2コントローラのコンストラクタ

答えて

12

で利用可能な私は、ユーザーにコンストラクタで一度それを行うと、これがログに記録したい

$em = $this->getDoctrine()->getEntityManager("pp_userdata"); 
$user = $this->get("security.context")->getToken()->getUser(); 

kernel.controllerイベントそのよう:次に

<service id="your_app.listener.before_controller" class="App\CoreBundle\EventListener\BeforeControllerListener" scope="request"> 
    <tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/> 
    <argument type="service" id="security.context"/> 
</service> 

でごBeforeControllerListenerあなたはそれがない場合は、あなたがインターフェイスからメソッドを呼び出し、秒で通過し、インタフェースを実装するかどうかを確認するために、コントローラをチェックします誠実な文脈。

use App\CoreBundle\Model\InitializableControllerInterface; 

class DefaultController implements InitializableControllerInterface 
{ 
    /** 
    * Current user. 
    * 
    * @var User 
    */ 
    private $user; 

    /** 
    * {@inheritdoc} 
    */ 
    public function initialize(Request $request, SecurityContextInterface $security_context) 
    { 
     $this->user = $security_context->getToken()->getUser(); 
    } 
// .... 
} 

インタフェース

namespace App\CoreBundle\Model; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\SecurityContextInterface; 

interface InitializableControllerInterface 
{ 
    public function initialize(Request $request, SecurityContextInterface $security_context); 
} 
以外の何ものでもありません:そうは次のように

<?php 

namespace App\CoreBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
use Symfony\Component\Security\Core\SecurityContextInterface; 
use App\CoreBundle\Model\InitializableControllerInterface; 

/** 
* @author Matt Drollette <[email protected]> 
*/ 
class BeforeControllerListener 
{ 

    protected $security_context; 

    public function __construct(SecurityContextInterface $security_context) 
    { 
     $this->security_context = $security_context; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 

     if (!is_array($controller)) { 
      // not a object but a different kind of callable. Do nothing 
      return; 
     } 

     $controllerObject = $controller[0]; 

     // skip initializing for exceptions 
     if ($controllerObject instanceof ExceptionController) { 
      return; 
     } 

     if ($controllerObject instanceof InitializableControllerInterface) { 
      // this method is the one that is part of the interface. 
      $controllerObject->initialize($event->getRequest(), $this->security_context); 
     } 
    } 
} 

その後、ユーザーが常に利用可能にしたいすべてのコントローラは、あなただけのそのインターフェイスを実装し、ユーザーを設定しますこれに

+0

誰かが書き込みをする方法を知っているので、

$this->getUser(); 

が働いれるべきyamlで設定しますか?私たちはyamlを使用しています。引数を追加する方法はわかりません。私はこれを読んでいます:http://symfony.com/doc/current/cookbook/service_container/event_listener.htmlもちろん助けなしで – Toskan

+0

@トスカンあなたはちょうど 'argument @ [@em"、 "@" some_service "]' – takeit

+0

app.listener.constructor_listener: クラス:AppBundle \のEventListener \ ConstructorListener 範囲:要求 引数: - {タイプ:サービスID:security.context} タグ: - {名:kernel.event_listener 、イベント:kernel.controller、メソッド:onKernelController} http://pastebin.com/NTySb68a – r4ccoon

2

私のアプローチがあった。

  1. 空のインターフェイスInitializableControllerInterface
  2. は、お使いのコントローラの追加
 
namespace ACMEBundle\Event; 

use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 

class ControllerConstructor 
{ 
    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 
     if (!is_array($controller)) { 
      // not a object but a different kind of callable. Do nothing 
      return; 
     } 

     $controllerObject = $controller[0]; 
     if ($controllerObject instanceof InitializableControllerInterface) { 
      $controllerObject->__init($event->getRequest()); 
     } 
    } 
} 
  1. のためのイベントリスナーを作成してください:
 
class ProfileController extends Controller implements 
     InitializableControllerInterface 
{ 
public function __init() 
    { 
$this->user = $security_context->getToken()->getUser(); 
} 

そして、あなたはの$ this - を取得することができます>それぞれの行動のユーザー。

よろしく

3

私は少し遅れrunnigんだけど、コントローラであなただけのユーザーにアクセスすることができます:2.1

関連する問題