是否可以将 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');
}
}
在查看使用 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');
}
}