Подтвердить что ты не робот

Приложения Symfony2 и Single Webpage с использованием инфраструктуры, такой как AngularJS

(Если это не подходящее место для публикации такого вопроса, я бы с радостью разместил его в другом месте)

Я пытаюсь создать интерактивное веб-приложение для управления ресурсами компании. У меня есть опыт работы с Symfony2, но я как бы ударил стену этим новым приложением.

Я хотел бы сделать это приложение совершенно интерактивным на стороне клиента. Почти полное приложение для одной веб-страницы. Мои предыдущие веб-приложения обычно использовали обычный шаблон MVC с страницами CRUD.

В этих простых приложениях я бы имел

/employees/
/employees/create
/employees/detail/45
/employees/update/45
/employees/delete/45

Использование symfony в этом виде приложений даст мне много преимуществ:

  • Routing
  • Безопасность (токены CSRF)
  • FormTypes и обработка формы
  • Проверка
  • Интеграция с доктриной
  • Twig

Особенно функциональность, подобная этой в Twig, была очень освежающей (поскольку мои модели были созданы как сущности Doctrine):

<p>{{ employee.getCurrentTask().description }}</p>

Проблема, с которой я столкнулся сейчас, заключается в том, что я чувствую, что Symfony2 на самом деле не создан для приложений с одной веб-страницей. Как только я попытаюсь добавить некоторую функциональность Ajax, я столкнулся с этими проблемами:

  • Недопустимые токены CSRF
  • Слишком много нерегулярной логики представления/представления в jQuery
  • Добавление атрибутов данных в html для получения идентификатора и т.д.

Затем я просмотрел Knockout.js и Angularjs, но потом я чувствую, что теряю все преимущества Doctrine и Twig. В любом случае я должен перестроить свои модели на стороне клиента и поддерживать их в двух разных местах.

Итак, я придумал эту идею:

  • Использовать модели и контроллеры Symfony2 для сохранения данных в базе данных, но пусть контроллеры в symfony просто отправят JSON и получат JSON (возможно, FOSRestBundle?)
  • Используйте фреймворк вроде AngularJS или KnockoutJS для восстановления данных JSON на стороне клиента, чтобы использовать двустороннюю привязку.

Но как бы я решал такие проблемы, как Doctrine2 Relationships, Form Validation, CSRF, которые Symfony уже решил, но непригодны для использования, если я использую фреймворк js framework?

Все предложения приветствуются!

4b9b3361

Ответ 1

Несколько слов о JSON, сериализации и моделях

Саймон, я столкнулся с теми же вопросами и проблемами. Сначала, как и кен, уже упоминалось. Вам не нужно перестраивать какую-либо модель. Лучше использовать FosRestBundle и/или JMS Serializer. Он превращает вас сущности с отношениями в объекты JSON. Эти объекты передаются через api в ваш интерфейс, и вы можете работать с ними так же, как в ветке, когда вы используете angular.js, как это

{[{ user.username }]}

такой же, как и на ветке. Но помните, что вам нужно установить пользовательские скобки для angular, потому что по умолчанию он использует то же, что и веточка.

Routing

Вы говорите о приложении с одной страницей, поэтому маршрутизация symfony поддерживается на низком уровне, чтобы обновить несколько страниц. Вместо этого вам нужно использовать маршрутизацию фреймворка frontend, потому что я знаком с angular.js, я привожу пример angular:

app.config(function($routeProvider, $interpolateProvider) {

    //here you go, custom brackets
    $interpolateProvider.startSymbol('{[{');
    $interpolateProvider.endSymbol('}]}');

    $routeProvider.when('/user', {
        controller: UserController, 
        templateUrl: Routing.generate('suser_list')
    }).when('/ticket', {
        controller: TicketController, 
        templateUrl: Routing.generate('ticket_list')
    });
});

Когда вы нажмете ссылку, например

<a href="#/ticket">Go to tickets</a>

AngularJs будет знать, какой контроллер интерфейса должен запускаться. Довольно замечательный материал, без перезагрузки страницы. Также посмотрите FosJSRoutingBundle. Он позволяет генерировать маршруты symfony в javascript, я использую их для связывания js-контроллеров с html-шаблонами, в которые вставляются данные.

FormTypes, обработка формы, проверка

Хорошо, когда вы используете фреймворк frontend, например angularjs, ваши типы форм symfony довольно бесполезны. Но я не уверен. Помните, что данные выталкиваются и вытягиваются через api как json, я думаю, что для типов форм было бы трудно справиться с такой сложностью.

Для проверки вы можете использовать angular живую проверку или у вас есть подтверждение symfony в бэкэнд, без проблем. Возможно, хорошо использовать проверку как на стороне клиента, так и на стороне сервера.

Twig

Твиг вне гонки. Все данные отображаются на стороне клиента, а не предварительно отображаются на стороне сервера, как с веточкой. Но это только в случае, если ваше приложение действительно одностраничное приложение. Конечно, вы можете использовать ветку, но она обновится только в том случае, если вы перезагрузите всю страницу.

Интеграция с доктриной

Вы можете использовать доктрину в бэкэнд. У вас есть конкретный вопрос относительно доктрины и SPA?

Ответ 2

Вам не нужно перестраивать модель на клиенте. Обычно я просто создаю службу в angularjs, которая предоставляет json-данные. Обработка данных по-прежнему происходит на стороне сервера с помощью ajax.

Для форм, требующих csrf, я обычно просто отправляю html, созданный веточкой через json. Или вы можете сериализовать $form- > createView() с помощью сериализатора jms. Однако вам понадобится клиент script, чтобы преобразовать данные json в элементы управления фактической формой.