首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FOSUserBundle FlashListener删除REGISTRATION_COMPLETED消息

FOSUserBundle FlashListener删除REGISTRATION_COMPLETED消息
EN

Stack Overflow用户
提问于 2016-09-30 05:54:10
回答 2查看 1K关注 0票数 2

我想重载FOS FlashListener::getSubscribedEvents()方法,只是为了注释REGISTRATION_COMPLETED行:

代码语言:javascript
运行
复制
// 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',
    );
}

这里的信息很少:

代码语言:javascript
运行
复制
// 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>

我已经做到了:

代码语言:javascript
运行
复制
<?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',
        ];
    }
}

那就是:

代码语言:javascript
运行
复制
#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 }

但是在订阅之后我仍然有这条消息。

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2016-10-01 03:29:24

由于事件订阅者的工作方式,这可能是不可能的,即使该覆盖看起来是覆盖正常服务的最佳实践方式,如果没有.class参数的话。

相反,您可能需要在捆绑包自己的CompilerPass中更深层次地覆盖它。

代码语言:javascript
运行
复制
// 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

票数 1
EN

Stack Overflow用户

发布于 2016-10-09 00:33:49

非常感谢您的帮助!

我已经做了一个硬性的钩子(等待有更多的时间来解决这个问题,我稍后会尝试你的解决方案):

代码语言:javascript
运行
复制
<?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);
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39780629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档