8

Symfony2コントローラーでコンストラクターを定義するにはどうすればよいですか? ログインしたユーザーデータをコントローラーのすべてのメソッドで取得したいのですが、現在、コントローラーのすべてのアクションでこのようなことを行って、ログインしているユーザーを取得しています。

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

コンストラクターで一度実行し、このログインユーザーをすべてのアクションで利用できるようにしたい

4

3 に答える 3

12

すべてのコントローラーアクションの前にコードを実行するための一般的なソリューションについては、次の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、コントローラーをチェックして、インターフェイスが実装されているかどうかを確認します。実装されている場合は、インターフェイスからメソッドを呼び出して、セキュリティコンテキストを渡します。

<?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 <matt@drollette.com>
 */
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);
        }
    }
}

次に、ユーザーを常に利用できるようにしたいコントローラーは、そのインターフェイスを実装し、ユーザーを次のように設定します。

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);
}
于 2012-06-24T17:13:25.327 に答える
4

私は少し遅れていますが、コントローラーではユーザーにアクセスするだけです:

$this->getUser();

2.1から動作するはずです

于 2013-10-01T14:33:19.257 に答える
2

これに対する私のアプローチは次のとおりです。

  1. 空のインターフェイスInitializableControllerInterfaceを作成します
  2. イベントリスナーを作成する
名前空間ACMEBundle\Event;

Symfony \ Component \ HttpKernel \ Event\FilterControllerEventを使用します;

クラスControllerConstructor
{{
    パブリック関数onKernelController(FilterControllerEvent $ event)
    {{
        $ controller = $ event-> getController();
        if(!is_array($ controller)){
            //オブジェクトではなく、別の種類の呼び出し可能。何もしない
            戻る;
        }

        $ controllerObject = $ controller [0];
        if($ controllerObject instanceof InitializableControllerInterface){
            $ controllerObject-> __ init($ event-> getRequest());
        }
    }
}
  1. コントローラに次を追加します。
クラスProfileControllerはControllerの実装を拡張します
        InitializableControllerInterface
{{
パブリック関数__init()
    {{
$ this-> user = $ security_context-> getToken()-> getUser();
}

そして、各アクションで$this->userを取得できるようになります。

よろしく

于 2012-06-26T07:49:40.630 に答える