Я создаю SPA, поддерживаемый Symfony и ApiPlatform, поэтому я хочу всегда загружать свой основной маршрут, несмотря на реальный путь URL-адреса.
Я хочу что-то вроде этого:
/**
* {@inheritdoc}
*/
class DefaultController extends Controller
{
/**
* @Route("/*", name = "homepage")
*
* @return Response
*/
public function indexAction(): Response
{
// replace this example code with whatever you need
return $this->render('default/index.html.twig');
}
}
В моих намерениях также, если URL-адрес похож на /path/to/the/spa/page, я все равно хочу загрузить DefaultController::indexAction()route.
Как это сделать? (очевидно, что приведенный пример не работает).





Хорошо, я нашел решение после "засветки".
Вспомнил, что есть возможность переписать все URL добавление или удаление завершающей косой черты
Прочитав эту статью, я увидел следующее:
class RedirectingController extends Controller
{
/**
* @Route("/{url}", name = "remove_trailing_slash",
* requirements = {"url" = ".*/$"})
*/
public function removeTrailingSlash(Request $request)
{
// ...
}
}
Итак, чтобы перехватить все URL-адреса, несмотря на путь, мой DefaultController::indexAction() становится таким:
class DefaultController extends Controller
{
/**
* @Route("/{url}",requirements = {"url" = ".*"}, name = "homepage")
*
* @return Response
*/
public function indexAction(): Response
{
// replace this example code with whatever you need
return $this->render('default/index.html.twig');
}
}
Теперь все URL-адреса обрабатываются DefaultController::indexAction(), несмотря на путь URL-адреса.
Я бы порекомендовал вам вместо этого использовать систему событий Symfony.
Подпишитесь на события kernel.request или kernel.router.
В случае kernel.request вам придется обогнать Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest()
приоритетным является 32 (используйте по крайней мере 33).
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class SpaSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 33],
];
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if (!$request->isXmlHttpRequest()) {
$html = $this->twig->render('spa.html.twig', [
'uri' => $request->getUri(),
]);
$response = new Response($html, Response::HTTP_OK);
$event->setResponse($response);
}
}
}
В случае kernel.router используйте как минимум приоритетный 1.
Вы можете использовать команду php bin/console debug:event-dispatcher, чтобы узнать, какие слушатели зарегистрированы для событий и их приоритеты.