Symfony Mgilet通知捆绑处理事件

时间:2018-12-14 08:54:20

标签: php symfony events event-listener

我没有很多Symfony经验,但是我正在开发使用https://github.com/maximilienGilet/notification-bundle的Symfony 4应用程序 添加和显示通知的效果很好,但是我仍然无法处理由捆绑创建的事件。

树枝模板中的表单(实际上是在我的基本树枝模板中)正在调用bundle post markasseen操作,该操作返回JSON真实消息,但是现在我不知道如何返回到该URL(路由)邮寄电话结束了吗?

这是我的routers.yaml,它“激活”捆绑控制器:

App\EventListener\NotificationListener:
    arguments: ['@router']
    tags:
        - { name: kernel.event_listener, event: mgilet.notification.seen }

如您所见,我已经尝试传递一个路由器参数,以查看是否给了我“返回”的可能性,但不幸的是,这没有帮助。

这是我为处理捆绑事件创建的EventListener:

<?php

namespace App\EventListener;

use Mgilet\NotificationBundle\Event;
use Mgilet\NotificationBundle\Event\NotificationEvent;

use \Symfony\Bundle\FrameworkBundle\Routing\Router;
use \Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;

class NotificationListener
{
    private $router;

    public function __construct(Router $router) {
        $this->router = $router;
    }

    public function OnMgiletNotificationSeen(Event\NotificationEvent $event): void {
        dd($event);
    }

}

正如我提到的,该事件被侦听器捕获,它返回“ true”,但是我想返回到调用post操作的路由/控制器。

这是基本模板中的表单(因为我想在所有模板中显示te通知),因此正在调用通知控制器:

<form action="/notifications/1/mark_as_seen/8" method="post">
    <button type="submit" class="close">
        <span aria-hidden="true">×</span><span class="sr-only">Close</span>
    </button>
</form>

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

正如https://stackoverflow.com/a/28913544/5475228所说,您可以通过以下方式使用twig变量获取当前路线:

run()

您还可以使用以下路线:

$this->execution()

因此,如果我理解您的问题,则可以在json响应为true之后重定向到此路由。

答案 1 :(得分:0)

我已经(暂时)解决了我的问题,尽管我认为这不是解决问题的最佳方法。

我在routes.yaml中禁用了捆绑控制器,并创建了一个用于处理帖子的自定义控制器。

class NotifyController extends Controller
{
    /**
     * Set a Notification as seen
     * @Route("/notifications/{notifiable}/mark_as_seen/{notification}", name="notification_mark_as_seen", methods={"POST"})
     */
    public function markAsSeenAction($notifiable, $notification, Request $request)
    {
        $manager = $this->get('mgilet.notification');
        $manager->markAsSeen(
            $manager->getNotifiableInterface($manager->getNotifiableEntityById($notifiable)),
            $manager->getNotification($notification),
            true
        );

        return $this->redirect($request->headers->get('referer'));
    }

    /**
     * Set all Notifications for a User as seen
     * @Route("/notifications/{notifiable}/markAllAsSeen", name="notification_mark_all_as_seen", methods={"POST"})
     */
    public function markAllAsSeenAction($notifiable, Request $request)
    {
        $manager = $this->get('mgilet.notification');
        $manager->markAllAsSeen(
            $manager->getNotifiableInterface($manager->getNotifiableEntityById($notifiable)),
            true
        );

        return $this->redirect($request->headers->get('referer'));
    }
}

感谢大家的帮助!