捆绑呼叫的监听器

时间:2012-10-01 12:42:15

标签: symfony

我的观点是在一些Bundle中的所有控制器中调用泛型函数(比如说AdminBundle)。我有一个登录监听器,我设置了一个包含true或false的会话,我需要在AdminBundle的每个方法之前检查这个会话。

所以我试着在我的AdminBundle控制器中创建一个__construct()函数,但看起来我无法从这个方法访问服务(因为容器尚未加载所以我无法访问$ this)

最佳做法应该是使用监听器在这些控制器的非常方法之前调用此服务,但我无法弄清楚我需要使用的监听器(无法在谷歌上找到线索......)。

希望足够清楚,如果你不理解我的观点,请不要犹豫提问!

提前感谢任何解决方案/想法(如果您认为我没有使用正确的方法来解释我的观点!)

1 个答案:

答案 0 :(得分:1)

在这个问题的下午之后,我终于得到了一个解决方案,感谢mahok。

对于那些有同样问题的人来说,这是我的控制器监听器:

<?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);
                    });
                }
            }
        }
    }
}

所以基本上它将你当前控制器动作的命名空间与另一个命名空间进行比较,如果是,我检查一些变量以了解用户是否可以在这里。

再次感谢mahok你告诉我的方式!