1

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

所以我尝试在我的 AdminBundle 控制器中创建一个 __construct() 函数,但似乎我无法通过此方法访问服务(因为尚未加载容器,所以我无法访问 $this)。

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

希望足够清楚,如果您不理解我的观点,请随时提出问题!

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

4

1 回答 1

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

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

再次感谢你给我指路!

于 2012-10-01T15:55:02.100 回答