Symfony: Как загрузить все пути из одного и того же индексного маршрута (для использования динамической маршрутизации в React SPA)

Я создаю 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.

Как это сделать? (очевидно, что приведенный пример не работает).

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
102
2

Ответы 2

Хорошо, я нашел решение после "засветки".

Вспомнил, что есть возможность переписать все 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, чтобы узнать, какие слушатели зарегистрированы для событий и их приоритеты.

Другие вопросы по теме