我没有很多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>
有人可以帮助我吗?
答案 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'));
}
}
感谢大家的帮助!