Symfony2 i pojedyncze aplikacje Webpage wykorzystujące framework taki jak AngularJS

(Jeśli to nie jest właściwe miejsce, aby pisać takie pytania, chętnie zamieściłbym je gdzie indziej)

[2]}próbuję zbudować interaktywną aplikację internetową do zarządzania zasobami firmy. Mam doświadczenie z Symfony2, ale trochę Uderzyłem w ścianę z tą nową aplikacją.

Chciałbym, aby ta aplikacja była dość interaktywna po stronie klienta. Prawie pełna aplikacja jednej strony internetowej. Moje poprzednie aplikacje internetowe normalnie używałyby typowego wzorca MVC z Kiepskie strony.

W tych prostych aplikacjach miałbym

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

Używanie symfony w tego typu aplikacjach dałoby mi wiele zalet:

  • Routing
  • bezpieczeństwo (tokeny CSRF)
  • Formtypy i obsługa formularzy
  • Walidacja
  • integracja z doktryną
  • Gałązka

Szczególnie funkcjonalność taka jak ta w gałązce była bardzo odświeżająca ( ponieważ moje modele były budowane jako doktryna podmioty):

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

Problem, z którym się teraz zmagam, polega na tym, że czuję, że Symfony2 nie jest tak naprawdę kompilowany dla pojedynczych aplikacji internetowych. jak tylko próbuję dodać jakąś funkcjonalność Ajax to mam do czynienia z tymi problemami :

  • niepoprawne tokeny CSRF
  • zbyt wiele logiki widoku / prezentacji wielokrotnego użytku w jQuery
  • dodawanie atrybutów danych w html, aby uzyskać id itp...

Potem spojrzałem na nokaut.js i Angularjs ale wtedy czuję się jak stracić wszystkie zalety doktryny i gałązki. I tak muszę przebudować modele po stronie klienta i wtedy muszę je konserwować w dwóch różnych lokalizacjach.

Więc wpadłem na ten pomysł:

  • używaj modeli i kontrolerów Symfony2 do utrwalania danych w bazie danych, ale pozwól kontrolerom w symfony po prostu wysyłać JSON i odbierać JSON (może FOSRestBundle?)
  • użyj frameworku takiego jak AngularJS lub KnockoutJS, aby odbudować dane JSON po stronie klienta, aby użyć 2-way Wiązanie.

Ale w jaki sposób mogę rozwiązać takie problemy jak Doctrine2 relacje, Walidacja formularzy, CSRF które Symfony już rozwiązane, ale są bezużyteczne, jeśli używam frontend js framework?

Wszelkie sugestie są mile widziane!

Author: Simon, 2013-04-10

2 answers

Kilka słów o JSON, serializacji i modelach

Simon, stałem przed dokładnie tymi samymi pytaniami i problemami. Najpierw, jak wspomniał ken. Nie musisz odbudowywać żadnego modelu. Lepiej Użyj FosRestBundle i / lub JMS Serializer. Zamienia encje z relacjami w obiekty JSON. Obiekty te są przenoszone przez api do twojego frontendu i możesz z nimi pracować tak jak w twig, kiedy używasz angular.js like this
{[{ user.username }]}

Jest tak samo jak w gałązce. Ale pamiętaj że trzeba ustawić niestandardowe nawiasy kątowe, ponieważ domyślnie używa tego samego co gałązka.

Routing

Mówisz o aplikacji jednostronicowej, więc routing symfony jest utrzymywany na niskim poziomie, aby mieć kilka odświeżeń stron. Zamiast tego musisz użyć routingu swojego frameworka frontend, ponieważ znam tylko angular.js, podaję przykład kątowy:

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')
    });
});

Kiedy trafisz na link jak

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

AngularJs będzie wiedział, który kontroler frontend uruchomić. Całkiem niezły materiał, bez przeładowania strony. Zobacz też: FosJSRoutingBundle. Pozwala na generowanie tras symfony w javascript, używam ich do łączenia kontrolerów js z szablonami html, gdzie dane są wepchnięte.

Formtypy, obsługa formularzy, Walidacja

Cóż, kiedy używasz frameworka frontend takiego jak angularjs, Twoje typy form symfony są dość bezużyteczne. Ale nie jestem pewien. Pamiętaj, że dane są popychane i wyciągane przez api jako json, myślę, że to być ciężką pracą dla typów form do obsługi tego rodzaju compexity.

Do walidacji możesz użyć live validation angular lub mieć walidację symfony w backendzie, nie ma problemu. Dobrym rozwiązaniem może być użycie zarówno walidacji po stronie klienta, jak i serwera.

Gałązka

Gałązka odpada z wyścigu. Wszystkie dane są renderowane po stronie klienta, a nie po stronie serwera, jak w przypadku twig. Ale dzieje się tak tylko w przypadku, gdy aplikacja jest naprawdę aplikacją jednostronicową. Oczywiście możesz użyć gałązki, ale odświeży się tylko wtedy, gdy przeładujesz całą stronę.

Integracja z doktryną

Nadal możesz używać doctrine w backendzie. Czy masz konkretne pytanie dotyczące doktryny i SPA?

 19
Author: Artjom Zabelin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-26 08:02:34

Nie musisz przebudowywać modelu w kliencie. Zwykle po prostu tworzę usługę w angularjs, która dostarcza dane json. Manipulacja danymi nadal odbywa się po stronie serwera przy użyciu ajax.

Dla formularzy, które wymagają csrf, zwykle po prostu wysyłam html renderowany przez gałązkę przez json. Możesz też serializować $form - >createView () za pomocą JMS serializer. Będziesz jednak potrzebował skryptu klienta, aby przekształcić dane json w rzeczywiste kontrolki formularza.

 2
Author: ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 23:20:44