2013-03-15 12 views
7

Mam ukończone że strona została stworzona w Symfony2 i teraz chcą dużo cech witryny, aby być teraz udostępniane w aplikacji mobilnej.
Mój pomysł polega na dołączeniu prostej zmiennej URL, a następnie wypisze wszystkie zmienne odpowiedniego żądania strony w JSON.wyjście Symfony2 dowolny kontroler HTML jako JSON

Więc jeśli mogę podłączyć do

www.domain.com/profile/john-smith 

Zwraca strony HTML, jak teraz.
Ale jeśli pójdę do

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

Następnie zwraca obiekt JSON imię, wiek i inne informacje profilu.
Mój kod aplikacji otrzymuje następnie JSON i procesy.

Nie widzę żadnych problemów związanych z bezpieczeństwem, ponieważ to po prostu zmienne przedstawione w JSON i bez HTML.

Wykonując powyższe czynności, mogę utworzyć cały kod aplikacji i po prostu wykonać połączenia z tym samym adresem URL, co strona internetowa, która zwróci zmienne w JSON i zapisze potrzebę dalszych prac po stronie serwera.

Pytanie brzmi: Jak zrobiłbym to bez modyfikowania każdego kontrolera?

Nie mogę sobie wyobrazić, detektor zdarzeń byłoby to zrobić? Może mógłbym przechwycić obiekt Response i usunąć cały HTML?

Jakieś pomysły na to, jak to zrobić w najlepszej praktyce? Kodowanie powinno być łatwe, ale staram się zrozumieć jego projekt.

Odpowiedz

5

Jest poprawny sposób skonfigurować trasy dla tego zadania

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

to jednak nadal wymaga, aby edytować każdy kontroler z dodatkowymi strukturami kontrolnymi do obsługi tego wyjścia.

Aby rozwiązać ten problem, można zrobić dwie rzeczy.

  1. Tworzenie szablonów json dla każdego szablonu masz, a następnie zastąpić html w template.html.twig z template.'.$format.'.twig. (Należy uważać, aby użytkownicy nie mogli przekazać parametru bez sprawdzenia poprawności w adresie URL, stanowiłoby to poważne zagrożenie bezpieczeństwa).

  2. Stwórz własną klasę abstrakcyjną kontrolera i zastąpić metodę renderowania w celu sprawdzenia wymaganej formie i zapewnić wyjście na podstawie tego.

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

UWAGA Powyższy kod jest prototypem, nie należy oczekiwać, że do pracy po wyjęciu z pudełka.

Ja osobiście uważam, że druga metoda jest bardziej poprawna, ponieważ nie ma duplikacji kodu i mniejszy jest obawy związane z bezpieczeństwem.

+1

Więcej informacji o * _format * http://symfony.com/doc/current/book/routing.html#advanced-routing-example – CSchulz

Powiązane problemy