1

私のポイントは、いくつかのバンドル (AdminBundle としましょう) のすべてのコントローラーでジェネリック関数を呼び出すことです。true または false を含むセッションを設定するログイン リスナーを取得しました。AdminBundle のすべてのメソッドの前に、このセッションをチェックする必要があります。

そのため、AdminBundle コントローラーで __construct() 関数を作成しようとしましたが、このメソッドからサービスにアクセスできないようです (コンテナーがまだ読み込まれていないため、$this にアクセスできないため)。

ベストプラクティスは、リスナーを使用して、これらのコントローラーのメソッドの前にこのサービスを呼び出すことですが、どのリスナーを使用する必要があるのか​​ わかりません(Googleで手がかりが見つかりません...)。

私の主張が理解できない場合は、遠慮なく質問してください。

解決策/アイデアを事前に感謝します(私が正しい方法を使用していないと思われる場合は、私の見解を説明してください!)

4

1 に答える 1

1

この問題の午後の後、マホクのおかげで最終的に解決策が得られました。

同じ問題を抱えている人のために、ここに私のコントローラーリスナーがあります:

<?php
namespace Site\MyBundle\Listener;

use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\Routing\Router;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\DependencyInjection\ContainerInterface;

class ControllerListener
{
    protected $container;
    protected $router;


    public function __construct(ContainerInterface $container, Router $router)
    {
        $this->router = $router;
        $this->container = $container;
    }

    public function onKernelController(FilterControllerEvent $event)
    {       
        if (HttpKernel::MASTER_REQUEST == $event->getRequestType()) 
        {
            $controller = $event->getController();
            $controller = $controller[0];

            $new = new \ReflectionObject($controller);

            if($new->getNamespaceName() == 'Site\MyBundle\Controller')
            {
                $test = $this->container->get('myservice')->test(); 
                if(empty($test) || !$test)
                {
                    $index = $this->router->generate('index');
                    $event->setController(function() use($index) {
                        return new RedirectResponse($index);
                    });
                }
            }
        }
    }
}

したがって、基本的には、現在のコントローラーのアクションの名前空間を別のコントローラーと比較し、真の場合、いくつかの変数をチェックして、ユーザーがここにいるかどうかを確認します。

もう一度道を教えてくれてありがとう!

于 2012-10-01T15:55:02.100 に答える