【问题标题】:Cannot get parameters to controller using event listener in Symfony2无法使用 Symfony2 中的事件侦听器将参数获取到控制器
【发布时间】:2013-09-25 18:42:55
【问题描述】:

我目前正在使用 Symfony2 事件侦听器根据用户身份验证状态将控制器更改为不同的控制器。我让侦听器设置新控制器,但它是在没有容器参数的情况下实例化的(即 $this->container 返回 null)。

有没有办法将容器传递给我要更改的控制器?

class AuthenticationListener
{
  public function onController(FilterControllerEvent $event)
  {
    $request = $event->getRequest();
    $session = $request->getSession();
    if (!$session->has('authenticated') || $session->get('authenticated') === false)
    {
      $controller = $event->getController();

      if (!($controller[0] instanceof AuthenticateController) && !($controller[0] instanceof ExceptionController))
      {
        $event->setController(array(new AuthenticateController(), 'loginAction'));
      }
    }
  }
}

【问题讨论】:

    标签: php symfony listener


    【解决方案1】:

    在这种情况下,AuthenticationListener 只是一个类

    如果你想在这个类中使用 $this->container 你必须这样做:

    class BeforeControllerListener extends ContainerAware
    {
    ...
    }
    

    在 config.yml 中

    core.listener.before_controller:
        class: App\YourBundle\EventListener\YourListener
        tags: [ {name: kernel.event_listener, event: kernel.controller, method: onKernelController}]
        calls:
            - [ setContainer,[ @service_container ]]
    

    【讨论】:

      【解决方案2】:

      当您自动创建控制器时,未设置容器。构造控制器后调用 setContainer。之后,您可以将其传递给事件。

      【讨论】:

      • 我最终只是将容器服务注入到 config.yml 中的侦听器中,然后在其构造函数中将容器传递给我的控制器,以使其可用于我在控制器中的操作。
      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2023-03-05
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2015-02-07
      相关资源
      最近更新 更多