2013-04-10 9 views
17

(Nếu đây không phải là nơi thích hợp để gửi loại câu hỏi tôi hạnh phúc muốn đăng nó ở một nơi khác)Symfony2 Và Độc thân trang web ứng dụng sử dụng một khuôn khổ như AngularJS

Tôi đang cố gắng để xây dựng một tương tác ứng dụng web để quản lý tài nguyên công ty. Tôi có kinh nghiệm với Symfony2 nhưng tôi đánh một bức tường với ứng dụng mới này.

Tôi muốn làm cho ứng dụng này khá tương tác ở phía máy khách. Hầu như một ứng dụng trang web đơn đầy đủ. Các ứng dụng web trước đây của tôi thường sẽ chỉ sử dụng mẫu MVC điển hình với các trang CRUD.

Trong những ứng dụng đơn giản, tôi sẽ phải

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

Sử dụng symfony bằng hiện vật này của ứng dụng sẽ cung cấp cho tôi rất nhiều ưu điểm:

  • Routing
  • Security (CSRF token)
  • FormTypes và xử lý biểu mẫu
  • Validation
  • Tích hợp với Học thuyết
  • Twig

Đặc biệt chức năng như thế này trong cành rất sảng khoái (từ mô hình của tôi là xây dựng như Học thuyết thực thể):

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

Vấn đề tôi đang đối mặt với bây giờ là tôi cảm thấy như Symfony2 không thực sự xây dựng cho các ứng dụng trang web đơn lẻ. Ngay sau khi tôi cố gắng thêm một số chức năng Ajax Tôi đang phải đối mặt với những vấn đề này:

  • CSRF mã thông báo hợp lệ
  • Quá nhiều không thể tái sử dụng xem/trình bày logic trong jQuery
  • Thêm dữ liệu thuộc tính trong html để lấy id của v.v ...

Sau đó tôi nhìn vào Knockout.js và Angularjs nhưng sau đó tôi cảm thấy như mất tất cả những ưu điểm của Doctrine và Twig. Tôi phải xây dựng lại mô hình của mình ở phía khách hàng và phải duy trì chúng ở hai địa điểm khác nhau sau đó.

Vì vậy, tôi đã đưa ra ý tưởng này: (? FOSRestBundle có lẽ)

  • mô hình sử dụng Symfony2 và bộ điều khiển để tồn tại dữ liệu vào cơ sở dữ liệu nhưng chúng ta hãy điều khiển trong symfony chỉ cần gửi ra JSON và nhận JSON
  • Sử dụng một khung công tác như AngularJS hoặc KnockoutJS để xây dựng lại dữ liệu JSON đó ở phía máy khách để sử dụng liên kết 2 chiều.

Nhưng sau đó thế nào tôi sẽ giải quyết những vấn đề như Doctrine2 Quan hệ, Form Validation, CSRF mà Symfony đã giải quyết nhưng không sử dụng được nếu tôi sử dụng khuôn khổ một lối vào js?

Mọi đề xuất đều được hoan nghênh!

Trả lời

19

Một số từ về JSON, serialization và Mô hình

Simon, tôi phải đối mặt với chính xác các câu hỏi và các vấn đề tương tự. Đầu tiên như ken đã được đề cập. Bạn không cần phải xây dựng lại bất kỳ mô hình nào. Sử dụng tốt hơn FosRestBundle và/hoặc JMS Serializer. Nó biến bạn các thực thể có quan hệ thành các đối tượng JSON. Đối tượng này được chuyển qua api tới lối vào của bạn và bạn có thể làm việc với chúng giống như trong cành cây, khi bạn sử dụng angular.js như thế này

{[{ user.username }]} 

tương tự như cành cây. Nhưng hãy nhớ rằng bạn phải đặt dấu ngoặc vuông tùy chỉnh cho góc cạnh theo mặc định nó sử dụng giống như cành cây.

Routing

Bạn nói của một ứng dụng trang duy nhất, vì vậy định tuyến của symfony được giữ trên một mức độ thấp để có vài refresh lại trang. Thay vào đó bạn phải sử dụng định tuyến của khuôn khổ frontend của bạn, bởi vì tôi chỉ quen thuộc với angular.js, tôi đưa ra một ví dụ góc:

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

Khi bạn nhấn một liên kết như

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

AngularJs sẽ biết mà bộ điều khiển giao diện người dùng kích hoạt. Những thứ tuyệt vời, không cần tải lại trang. Ngoài ra, hãy xem FosJSRoutingBundle. Nó cho phép bạn tạo ra các tuyến đường symfony trong javascript, tôi sử dụng chúng để liên kết điều khiển js với các mẫu html, nơi dữ liệu được đẩy vào.

FormTypes, Mẫu xử lý, Validation

Vâng, khi bạn sử dụng một khuôn khổ frontend giống như angularjs, các dạng biểu mẫu của symfony khá vô dụng. Nhưng tôi không chắc chắn. Ghi dữ liệu được đẩy và kéo qua api như json, tôi nghĩ rằng đây sẽ là một công việc khó khăn đối với các loại biểu mẫu để xử lý loại sự hợp tác này.

Để xác thực, bạn có thể sử dụng tính năng xác thực trực tiếp của angular hoặc xác nhận tính hợp lệ của symfony trong chương trình phụ trợ, không vấn đề gì. Nó có thể là một điều tốt để sử dụng cả hai, xác thực phía máy khách và phía máy chủ.

Twig

cành là ra khỏi cuộc đua. Tất cả dữ liệu được hiển thị ở phía máy khách và không được hiển thị trước trên phía máy chủ như với cành cây. Nhưng đó chỉ là trường hợp nếu ứng dụng của bạn thực sự là một ứng dụng đơn. Tất nhiên bạn có thể sử dụng cành cây, nhưng nó sẽ chỉ làm mới nếu bạn tải lại toàn bộ trang.

Tích hợp với Học thuyết

Bạn vẫn có thể sử dụng học thuyết trong backend. Bạn có câu hỏi cụ thể liên quan đến học thuyết và SPA không?

+0

Chỉ muốn chia sẻ rằng bạn vẫn có thể sử dụng FormType tốt mà không gặp vấn đề gì cả. Khi bạn nhận dữ liệu từ yêu cầu REST, nó có thể được phân tích cú pháp và sau đó hoạt động giống như bất kỳ việc gửi biểu mẫu nào khác. – mr1031011

2

Bạn không cần phải xây dựng lại mô hình trong ứng dụng khách. Tôi thường chỉ tạo ra một dịch vụ trong angularjs cung cấp dữ liệu json. Thao tác dữ liệu vẫn xảy ra phía máy chủ sử dụng ajax.

Đối với các biểu mẫu yêu cầu csrf, tôi thường chỉ gửi html được hiển thị bằng cành cây qua json. Hoặc bạn có thể serialize $ form-> createView() với serializer jms. Tuy nhiên, bạn sẽ cần một số kịch bản lệnh khách để chuyển đổi dữ liệu json thành các điều khiển biểu mẫu thực tế.

+0

Cảm ơn bạn đã nhập! Nhưng sau đó bạn sẽ không thể sử dụng tất cả ma thuật mà http://docs.angularjs.org/api/ngResource.$resource cung cấp? – Simon