я работаю над Symfony 4.
У меня есть услуга:
App\EventListener\EbayExceptionListener:
tags:
- { name: kernel.event_listener, event: kernel.controller }
arguments: [ "@doctrine.orm.entity_manager" , "@router" , "@session" ]
А вот и мой слушатель:
<?php
namespace App\EventListener;
use App\Entity\Ebay;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Routing\Router;
class EbayExceptionListener
{
private $repository;
private $router;
private $session;
private $redirectName = 'home';
public function __construct(EntityManager $entityManager, Router $router, Session $session)
{
$this->repository = $entityManager->getRepository(Ebay::class);
$this->router = $router;
$this->session = $session;
}
//Check if an eBay entity exist in the database, if not redirect to the form to create the eBay entity
public function onKernelController(FilterControllerEvent $event)
{
$ebay = $this->repository->findOneBy(['name' => 'Ebay']);
$request = $event->getRequest();
$routeName = $request->get('_route');
dump($routeName);
if ($routeName != "home" AND $ebay == null) {
$this->session->getFlashBag()->add('error', 'Please provide information for Ebay form');
return new RedirectResponse($this->router->generate($this->redirectName));
}
}
}
Мой контроллер:
<?php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HomeController extends Controller
{
/**
* @Route("/", name = "home")
*/
public function index()
{
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
]);
}
}
У меня проблема с var $routeName внутри моего слушателя, на самом деле значением этой переменной должно быть имя текущего маршрута. Но когда я использую dump($routeName)
У меня 2 результата: "_wdt" и "home"
Я не знаю, почему параметры $request не совпадают, когда мой слушатель выполняется и после того, как страница была сгенерирована.
Поскольку у меня нет вызова страницы "_wdt", он должен быть "home".
Я сделал что-то не так ?
Спасибо за помощь.
Привет, Cerad, спасибо за ваш ответ, но я не понял, как решить мою проблему. Что вы имеете в виду, говоря «добавить проверку, чтобы игнорировать _wdt»?
если ($ routeName === '_wdt') return;
Спасибо Cerad, я смог найти свой ответ в его посте здесь: stackoverflow.com/questions/48074428/…
Ничто так не говорит "спасибо", как голос "за".




_Wdt - это то, что панель профиля в нижней части экрана использует для получения отладочной информации. Что происходит, так это то, что домашний маршрут возвращает ответ, а затем используется JavaScript для вызова маршрута _wdt. И вы видите оба. Это произойдет только в режиме разработки, поэтому просто добавьте галочку, чтобы игнорировать _wdt. Вы также должны знать, что можно создавать подзапросы, которые в основном вкладывают маршруты. Таким образом, вы должны убедиться, что запрос также является основным запросом.