是否有可能将EventSubscribers与Silex一起使用?

时间:2015-09-28 16:11:00

标签: php silex

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

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

所以我的订阅者类都设置好了,但是我不知道该怎么做才能将注册视为Silex中的一个事件。

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

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

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

谢谢,罗素

更新

这是我的订阅者类:

<?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有资格作为交互式登录,所以我不确定为什么没有调用该方法。

1 个答案:

答案 0 :(得分:2)

您的订阅者类应实现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');
  }
}