我想重载FOS FlashListener::getSubscribedEvents()
方法,只是为了注释REGISTRATION_COMPLETED
行:
// vendor/friendsofsymfony/user-bundle/EventListener/FlashListener.php
public static function getSubscribedEvents() {
return array(
FOSUserEvents::CHANGE_PASSWORD_COMPLETED => 'addSuccessFlash',
FOSUserEvents::GROUP_CREATE_COMPLETED => 'addSuccessFlash',
FOSUserEvents::GROUP_DELETE_COMPLETED => 'addSuccessFlash',
FOSUserEvents::GROUP_EDIT_COMPLETED => 'addSuccessFlash',
FOSUserEvents::PROFILE_EDIT_COMPLETED => 'addSuccessFlash',
FOSUserEvents::REGISTRATION_COMPLETED => 'addSuccessFlash',
FOSUserEvents::RESETTING_RESET_COMPLETED => 'addSuccessFlash',
);
}
这里的信息很少:
// vendor/friendsofsymfony/user-bundle/Resources/config/flash_notifications.xml
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="fos_user.listener.flash" class="FOS\UserBundle\EventListener\FlashListener">
<tag name="kernel.event_subscriber" />
<argument type="service" id="session" />
<argument type="service" id="translator" />
</service>
</services>
</container>
我已经做到了:
<?php
// src/XXXX/UserBundle/EventListener/FlashListener.php
namespace XXXX\UserBundle\EventListener;
use FOS\UserBundle\EventListener\FlashListener AS BaseListener;
use FOS\UserBundle\FOSUserEvents;
class FlashListener extends BaseListener {
public static function getSubscribedEvents() {
return [
FOSUserEvents::CHANGE_PASSWORD_COMPLETED => 'addSuccessFlash',
FOSUserEvents::GROUP_CREATE_COMPLETED => 'addSuccessFlash',
FOSUserEvents::GROUP_DELETE_COMPLETED => 'addSuccessFlash',
FOSUserEvents::GROUP_EDIT_COMPLETED => 'addSuccessFlash',
FOSUserEvents::PROFILE_EDIT_COMPLETED => 'addSuccessFlash',
// FOSUserEvents::REGISTRATION_COMPLETED => 'addSuccessFlash',
FOSUserEvents::RESETTING_RESET_COMPLETED => 'addSuccessFlash',
];
}
}
那就是:
#src/XXXX/XXXXXBundle/Resources/config/services.yml
services:
fos_user.listener.flash:
class: XXXX\UserBundle\EventListener\FlashListener
arguments: ['@session','@translator']
tags:
- { name: kernel.event_subscriber }
但是在订阅之后我仍然有这条消息。
有人能帮帮我吗?
发布于 2016-10-01 03:29:24
由于事件订阅者的工作方式,这可能是不可能的,即使该覆盖看起来是覆盖正常服务的最佳实践方式,如果没有.class参数的话。
相反,您可能需要在捆绑包自己的CompilerPass
中更深层次地覆盖它。
// src/Acme/DemoBundle/DependencyInjection/Compiler/OverrideServiceCompilerPass.php
namespace Acme\DemoBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class OverrideServiceCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition('original-service-id');
$definition->setClass('Acme\DemoBundle\YourService');
}
}
另请参阅How to override FOSUserBundle's EmailConfirmationListener
发布于 2016-10-09 00:33:49
非常感谢您的帮助!
我已经做了一个硬性的钩子(等待有更多的时间来解决这个问题,我稍后会尝试你的解决方案):
<?php // src/ACME/UserBundle/EventListener/FlashListener.php
namespace ACME\UserBundle\EventListener;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class FlashListener implements EventSubscriberInterface {
private $router;
private $session;
public function __construct(UrlGeneratorInterface $router, Session $session) {
$this->router = $router;
$this->session = $session;
}
public static function getSubscribedEvents() {
return [
FOSUserEvents::REGISTRATION_COMPLETED => ['removeSuccessFlash', -1]
];
}
public function removeSuccessFlash(Event $event, $eventName = null) {
// on supprime le dernier message success : registration.flash.user_created
// méthode moche, essayer de surcharger la méthode
// FOS\UserBundle\EventListener\FlashListener::getSubscribedEvents()
$flashBag = $this->session->getFlashBag();
if ($flashBag->peek('success')) {
$flashes = $flashBag->all();
array_pop($flashes['success']);
if (!isset($flashes['success'][0])) {
unset($flashes['success']);
}
if ($flashes) {
$flashBag->setAll($flashes);
}
}
}
}
https://stackoverflow.com/questions/39780629
复制相似问题