2013-04-10 14 views
17

(Jeśli to nie jest właściwe miejsce, aby opublikować tego rodzaju pytanie ja bym chętnie po to gdzieś indziej)Symfony2 I pojedynczego internetowej Aplikacje wykorzystujące ramy jak angularjs

Próbuję zbudować interaktywny aplikacja internetowa do zarządzania zasobami firmy. Mam doświadczenie z Symfony2, ale w pewnym sensie uderzam w ścianę dzięki tej nowej aplikacji.

Chciałbym, aby ta aplikacja była dość interaktywna po stronie klienta. Prawie pełna, pojedyncza aplikacja internetowa. Moje poprzednie aplikacje internetowe zwykle używają typowego wzorca MVC ze stronami CRUD.

W tych prostych aplikacji musiałbym

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

Korzystanie symfony w tego rodzaju aplikacji dałby mi wiele zalet:

  • Routing
  • (tokeny CSRF) Bezpieczeństwo
  • FormTypes i obsługa formularzy
  • Validation
  • Integracja z Doctrine
  • Gałązka

Zwłaszcza funkcjonalność jak to w Gałązka był bardzo orzeźwiający (ponieważ moje modele były budowane jako podmioty Doktryny):

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

Problem Wobec tego czuję, że Symfony2 tak naprawdę nie jest budowana dla pojedynczych aplikacji internetowych. Jak tylko próbuję dodać funkcjonalność Ajax mam do czynienia z tymi problemami:

  • CSRF tokeny nieprawidłowy
  • Zbyt dużo non wielokrotnego użytku view/logiki prezentacji w jQuery
  • dodawanie danych w atrybuty html, aby uzyskać identyfikator itp ...

Potem zajrzałem do Knockout.js i Angularjs, ale wtedy czuję, że tracę wszystkie zalety Doktryny i Gałązki. Muszę zrekonstruować moje modele po stronie klienta i muszę je zachować w dwóch różnych lokalizacjach.

Więc wpadłem na ten pomysł: (? FOSRestBundle może)

  • modele i kontrolery Zastosowanie Symfony2 utrzymują się do bazy danych, ale pozwól kontrolery w symfony tylko wysłać JSON i odbierać JSON
  • użytku struktura taka jak AngularJS lub KnockoutJS w celu przebudowania danych JSON po stronie klienta w celu użycia wiązania dwukierunkowego.

Ale wtedy jak bym rozwiązania problemów takich jak Doctrine2 Relationships, formy walidacji, CSRF który Symfony już rozwiązanych, ale są bezużyteczne, jeśli mogę użyć nakładka js ram?

Wszystkie sugestie są mile widziane!

Odpowiedz

19

Kilka słów o JSON, serializacji i modele

Szymonie, mam do czynienia dokładnie te same pytania i problemy. Najpierw jak wspomniany już Ken. Nie trzeba przebudowywać żadnego modelu. Lepiej użyj FosRestBundle i/lub JMS Serializer. Przekształca twoje jednostki w relacje w obiekty JSON. Te obiekty są przekazywane za pośrednictwem interfejsu API do frontend i można pracować z nimi tak jak w gałązka podczas korzystania angularjs jak ten

{[{ user.username }]} 

jest tak samo jak w patyk. Ale pamiętaj, że musisz ustawić niestandardowe nawiasy klamrowe, ponieważ domyślnie używa tego samego, co gałązka.

Routing

mówisz o pojedynczej aplikacji stron, więc routing symfony jest utrzymywana na niskim poziomie, aby mieć kilka odświeżania strony. Zamiast tego trzeba użyć routing Twojego ramach frontend, ponieważ znam tylko z angularjs, daję kątową przykład:

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 link jak

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

angularjs będzie wiedział który kontroler frontendu uruchamia. Świetne rzeczy, bez odświeżania strony. Zobacz także FosJSRoutingBundle. To pozwala na generowanie tras symfony w JavaScript, używam je połączyć js kontrolerów z szablonów html gdzie dane jest wciśnięty.

FormTypes, manipulacja Forma, walidacja

Cóż, kiedy używasz ramy frontend jak angularjs, twoje typy formularzy symfony są całkiem bezużyteczne. Ale nie jestem pewien. Pamiętaj, dane są pchane i wyciągane przez api jako json, myślę, że byłoby to trudne zadanie dla typów formularzy do obsługi tego rodzaju compexity.

W celu sprawdzenia poprawności można użyć funkcji sprawdzania poprawności na żywo lub sprawdzania poprawności symfonii w systemie zaplecza, bez problemu. Dobrym pomysłem może być użycie sprawdzania poprawności zarówno po stronie klienta, jak i po stronie serwera.

Gałązka

Gałązka jest z wyścigu. Wszystkie dane są renderowane po stronie klienta, a nie przed renderowaniem po stronie serwera, jak za pomocą gałązki. Ale dzieje się tak tylko wtedy, gdy twoja aplikacja jest naprawdę pojedynczą aplikacją strony. Oczywiście możesz użyć gałązki, ale odświeży się tylko, jeśli załadujesz ponownie całą stronę.

Integracja z doktryną

Można nadal używać doktrynę w backend. Czy masz konkretne pytanie dotyczące doktryny i SPA?

+0

Po prostu chcesz się dzielić, że nadal możesz używać FormType dobrze, bez problemu. Po otrzymaniu danych z żądania REST można je parsować, a następnie zachowuje się jak każdy inny formularz. – mr1031011

2

Nie trzeba odbudowywać modelu w kliencie. Zwykle po prostu tworzę usługę w angularjs, która dostarcza dane json. Obsługa danych nadal odbywa się po stronie serwera przy użyciu ajax.

Dla formularzy, które wymagają csrf, zwykle wysyłam html renderowany przez gałązkę przez json. Lub możesz serializować $ form-> createView() z jms serializer. Jednak będziesz potrzebował jakiegoś skryptu klienta, aby przekształcić dane json w rzeczywiste formanty formularzy.

+0

Dzięki za twój wkład! Ale wtedy nie byłbyś w stanie użyć całej magii, którą zapewnia http://docs.angularjs.org/api/ngResource.$resource? – Simon