2013-03-15 34 views
7

Tôi đã hoàn tất một trang web được tạo trong Symfony2 và bây giờ tôi muốn rất nhiều tính năng của trang web hiện có sẵn trong ứng dụng dành cho thiết bị di động.
Ý tưởng của tôi là bằng cách thêm một biến URL đơn giản, sau đó nó sẽ xuất tất cả các biến của yêu cầu trang có liên quan trong JSON.Symfony2 xuất ra bất kỳ bộ điều khiển HTML nào dưới dạng JSON

Vì vậy, nếu tôi kết nối với

www.domain.com/profile/john-smith 

Nó trả về trang HTML như bây giờ.
Nhưng nếu tôi đi đến

www.domain.com/profile/john-smith?app 

Sau đó, nó sẽ trả về một đối tượng JSON của tên, tuổi và thông tin cấu hình khác.
Mã ứng dụng của tôi sau đó nhận được JSON và các quy trình.

Tôi không thể thấy bất kỳ vấn đề bảo mật nào vì nó chỉ thực sự là các biến được trình bày trong JSON và không có HTML.

Bằng cách thực hiện ở trên, tôi có thể tạo tất cả mã ứng dụng và chỉ cần thực hiện cuộc gọi đến cùng một URL với trang web, sẽ trả về các biến trong JSON và tiết kiệm nhu cầu cho bất kỳ công việc phía máy chủ nào khác.

Câu hỏi đặt ra là: Làm cách nào để làm điều này mà không sửa đổi mọi bộ điều khiển?

Tôi không thể tưởng tượng người nghe sự kiện sẽ làm điều đó? Có lẽ tôi có thể đánh chặn đối tượng Response và loại bỏ tất cả HTML?

Bất kỳ ý tưởng nào là cách thực hành tốt nhất để thực hiện việc này? Nó khá dễ dàng để viết mã, nhưng tôi đang cố gắng để có được đầu của tôi xung quanh thiết kế của nó.

Trả lời

5

Có một cách chính xác để cấu hình các tuyến đường cho nhiệm vụ này

article_show: 
    path:  /articles/{culture}/{year}/{title}.{_format} 
    defaults: { _controller: AcmeDemoBundle:Article:show, _format: html } 
    requirements: 
     culture: en|fr 
     _format: html|rss 
     year:  \d+ 

Tuy nhiên, đây vẫn sẽ yêu cầu bạn chỉnh sửa tất cả các điều khiển với các cấu trúc kiểm soát bổ sung để xử lý đầu ra.

Để giải quyết vấn đề đó, bạn có thể làm hai việc.

  1. Tạo mẫu json cho mỗi mẫu mà bạn có, sau đó thay thế html trong template.html.twig với template.'.$format.'.twig. (Hãy cẩn thận để đảm bảo người dùng không thể chuyển một tham số mà không xác nhận trong url, điều này sẽ là một nguy cơ bảo mật lớn).

  2. Tạo lớp trình điều khiển trừu tượng của riêng bạn và ghi đè phương thức hiển thị để kiểm tra định dạng được yêu cầu và cung cấp đầu ra dựa trên đó.

    class MyAbstractController extends Symfony\Bundle\FrameworkBundle\Controller\Controller 
    { 
        public function render($view, array $parameters = array(), Response $response = null) 
        { 
         if($this->getRequest()->getRequestFormat() == 'json') 
         { 
          return new Response(json_encode($parameters)); 
         } 
         else 
         { 
          parent::render($view, $parameters, $response); 
         } 
        } 
    } 
    

LƯU Ý Đoạn mã trên là một nguyên mẫu, tôi không mong đợi nó hoạt động ra khỏi hộp.

Cá nhân tôi sẽ coi phương pháp thứ hai chính xác hơn, bởi vì không có sự trùng lặp mã và ít mối quan tâm về bảo mật hơn.

+1

Thông tin chi tiết khác về * _format * http://symfony.com/doc/current/book/routing.html#advanced-routing-example – CSchulz

Các vấn đề liên quan