Symfony 捆绑调用上的侦听器
我的观点是在某个捆绑包(比如AdminBundle)中的所有控制器中调用一个通用函数。我在其中设置了一个包含true或false的会话,我需要在我的AdminBundle的每个方法之前检查这个会话 因此,我尝试在AdminBundle控制器中创建一个_construct()函数,但似乎无法通过此方法访问服务(因为容器尚未加载,所以无法访问$this) 最好的做法应该是在使用这些控制器的每个方法之前使用侦听器调用此服务,但我不知道我需要使用哪个侦听器(在google上找不到线索…) 希望足够清楚,如果你不明白我的意思,不要犹豫问问题Symfony 捆绑调用上的侦听器,symfony,Symfony,我的观点是在某个捆绑包(比如AdminBundle)中的所有控制器中调用一个通用函数。我在其中设置了一个包含true或false的会话,我需要在我的AdminBundle的每个方法之前检查这个会话 因此,我尝试在AdminBundle控制器中创建一个_construct()函数,但似乎无法通过此方法访问服务(因为容器尚未加载,所以无法访问$this) 最好的做法应该是在使用这些控制器的每个方法之前使用侦听器调用此服务,但我不知道我需要使用哪个侦听器(在google上找不到线索…) 希望足够清楚,
提前感谢您提供的任何解决方案/想法(如果您认为我没有使用正确的方法,请解释我的观点!)下午讨论这个问题后,多亏了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,我终于找到了解决方案
对于那些有相同问题的人,这里是我的控制器侦听器:
<?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);
});
}
}
}
}
}
也许这有帮助:或者更简洁:您可能正在查找控制器事件谢谢我查看了onKernelController侦听器,但我从该侦听器中唯一能得到的是调用的操作,而不是包名称。至于来自whitch的请求侦听器,我试图获取这些信息。我真的不认为有一种方法可以做得很好。。。如果我找不到路,我会做路线测试,但我不喜欢。无论如何谢谢你!也许这有帮助:或者更简洁:您可能正在查找控制器事件谢谢我查看了onKernelController侦听器,但我从这个侦听器中唯一能得到的是调用的操作,而不是包名称。至于来自whitch的请求侦听器,我试图获取这些信息。我真的不认为有一种方法可以做得很好。。。如果我找不到路,我会做路线测试,但我不喜欢。无论如何谢谢你!