Уведомление Symfony Mgilet Bundle обрабатывает события - PullRequest
0 голосов
/ 14 декабря 2018

У меня нет большого опыта работы с Symfony, но я работаю над приложением Symfony 4, которое использует https://github.com/maximilienGilet/notification-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.

Это форма в базовом шаблоне (потому что я хочу показать уведомления во всех шаблонах), которая вызывает контроллер уведомлений:

<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 голосов
/ 14 декабря 2018

Я решил свою проблему (временно), хотя я не думаю, что это лучший способ решения.

Я отключил контроллер связок в route.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'));
    }
}

Спасибо всем за помощь!

0 голосов
/ 14 декабря 2018

как https://stackoverflow.com/a/28913544/5475228 скажем, вы можете использовать текущий маршрут, используя переменную ветки, таким образом:

app.request.attributes.get('_route')

, также вы можете иметь предыдущий маршрут с этим:

app.request.headers.get('referer')

Итак, если я понимаю вашу проблему, вы можете перенаправить на этот маршрут после того, как ответ json верен.

...