Quber
@Quber
PHP Team lead

Как связать AnularJs Route и Symfony Routing?

Есть адрес страницы: test.ru/post/153245
Загрузка страницы по маршруту angular
$routeProvider.when("/post/153245", {
            templateUrl: "/post/153245",
            controller: 'MainController',
            controllerAs: 'main'
        });


Всё работает. Но что если пользователь попадает на сайт напрямую по этому адресу? Загрузится шаблон и потом загрузит его angular второй раз. Как этого избежать?

Маршрут симфони:
post:
    path: /post/{id}
    defaults: { _controller: AcmeCoreBundle:Post:index }

Шаблон twig
{% extends '::layoute.html.twig' %}

{% block content %}
    MAIN
{% endblock %}
  • Вопрос задан
  • 2804 просмотра
Решения вопроса 1
agladkov
@agladkov
Несмотря на то, что в первом вопросе всё решили, оставлю своё решение первоначального вопроса.

Во-первых, мы просим ангуляр при запросах на сервер отправлять заголовок 'X-Requested-With':
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

Соответственно теперь на серверной стороне мы всегда знаем это первичная загрузка шаблона, либо запрос от ангуляра:
if ($request->isXmlHttpRequest())
Если первичная загрузка, то отдаем базовый шаблон, например '::layoute.html.twig', в котором область под шаблон конкретной страницы обернута в ngView.
Если запрос от ангуляра, то обрабатываем запрос и отдаем подготовленный шаблон для втсавки в ngView.

Мы делаем так, потому что мы генерим шаблон на основании прав пользователя.
Данные для шаблона отдаем через ngInit.

Такая схема так же дает возможность достаточно просто работать с формами: генерировать со всеми нужными атрибутами, отправлять ангуляром в правильном виде симфони и соответственно выводить результаты обработки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@apasen
Однажды у меня уже была такая идея, но после долгих размышлений на эту тему я понял, что этого не стоит делать вообще. А лучше разделить бекенд от фронтенда. Создавайте REST приложение. Т.е. фронтент это отдельное приложение на angular со своим роутингом, а бекенд, в данном случае написанный на symfony, реализация API. Но уже если будет крайняя необходимость использовать роут symfony в angualr есть FOSjsRoutingBundle
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы