是否可以将 EventSubscriber 与 Silex 一起使用?

Is it possible to use EventSubscribers with Silex?

在查看使用 AuthenticationHandlers 时,我看到 Symfony 支持 EventSubscribers,在使用多种方法进行身份验证时,它可以更加灵活。

我一直以此为例:https://knpuniversity.com/screencast/guard/success-handling

所以我的订户 class 已完成所有设置,但我不知道如何注册为 Silex 中的事件。

我很确定我需要使用 $app['dispatcher'] 但我不知道要监听什么事件。使用页面中的示例,在 Symfony 配置中,服务被标记为 kernel.event_subscriber 但是当我在 Silex 中执行以下操作时没有任何反应:

$app['dispatcher'] -> addListener(KernelEvents::EVENT_SUBSCRIBER, function(Event $event) use ($app) { ... do something ... });

我很确定我监听的事件是错误的,但我也没有收到任何错误。这种事情在 Silex 中可能吗?

谢谢拉塞尔

更新:

这是我的订阅者class:

<?php

namespace MySubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;

class ApiKeySubscriber implements EventSubscriberInterface {

  public function onInteractiveLogin(InteractiveLoginEvent $event) {

    file_put_contents("/tmp/onInteractiveLogin.txt", "It was ehere");

  }

  public static function getSubscribedEvents() {
    return array(SecurityEvents::INTERACTIVE_LOGIN => 'onInteractiveLogin');
  }
}

防火墙很简单:

    // Configure the firewalls for the application
    $app['security.firewalls'] = array(
        'basicauth' => array(
            'pattern' => '^/auth',
            'http' => true,
            'users' => $app -> share(function() use ($app) {
                return new UserAccount($app);
            })
        )
    );

然后我添加订阅者:

$app['dispatcher'] -> addSubscriber(new \MySubscriber\ApiKeySubscriber());

我假设 Basic Auth 符合交互式登录的条件,所以我不确定为什么没有调用该方法。

您的订阅者 class 应该实施 EventSubscriberInterface。如果是这样,只需使用 addSubscriber 方法而不是 addListener.

$app['dispatcher']->addSubscriber(new MyEventSubscriber());

您的事件订阅者有一个名为 getSubscribedEvents 的方法,它告诉 Symfony 要订阅什么事件,因此您根本不需要传递事件名称。有关详细信息,请参阅 the Symfony docs

更新(安全侦听器):

基本的HTTP认证方式不考虑交互式登录。这是典型的基于 Web 的登录表单。

您可以改用 AuthenticationEvents::AUTHENTICATION_SUCCESS。您的侦听器方法将收到一个 AuthenticationEvent 实例。

<?php
namespace MySubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\Security\Core\Event\AuthenticationEvent;

class ApiKeySubscriber implements EventSubscriberInterface
{
  public function onAuthenticate(AuthenticationEvent $event)
  {
    file_put_contents("/tmp/onInteractiveLogin.txt", "It was here");
  }

  public static function getSubscribedEvents()
  {
    return array(AuthenticationEvents::AUTHENTICATION_SUCCESS => 'onAuthenticate');
  }
}