У меня нет большого опыта работы с 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, который я создал для обработки события bundle:
<?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>
Кто-нибудь может мне помочь, пожалуйста!
как https://stackoverflow.com/a/28913544/5475228 скажем, вы можете получить текущий маршрут, используя переменную twig следующим образом:
app.request.attributes.get('_route')
также вы можете иметь предыдущий маршрут с этим:
app.request.headers.get('referer')
Итак, если я понимаю вашу проблему, вы можете перенаправить на этот маршрут после того, как ответ json верен.
Я решил свою проблему (временно), хотя я не думаю, что это лучший способ решить.
Я отключил контроллер связки в routs.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'));
}
}
Спасибо всем за помощь!