2013-03-15 15 views
7

Ho un sito Web completato che è stato creato in Symfony2 e ora desidero che molte delle funzionalità del sito siano rese disponibili in un'app mobile.
La mia idea è aggiungendo una semplice variabile URL quindi produrrà tutte le variabili della richiesta di pagina pertinente in JSON.Symfony2 ha emesso qualsiasi controller HTML come JSON

Quindi, se mi collego al

www.domain.com/profile/john-smith 

Esso restituisce la pagina HTML come ora.
Ma se vado a

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

Poi si restituisce un oggetto JSON di nome, età e altre informazioni del profilo.
Il mio codice app riceve quindi JSON e processi.

Non riesco a vedere alcun problema di sicurezza in quanto sono solo le variabili presentate in JSON e nessun HTML.

Effettuando quanto sopra, posso creare tutto il codice dell'app e semplicemente effettuare chiamate allo stesso URL di una pagina Web, che restituirebbe le variabili in JSON e salverà la necessità di ulteriori operazioni sul lato server.

La domanda è: Come farei questo senza modificare ogni controller?

Non riesco a immaginare un ascoltatore di eventi potrebbe farlo? Forse potrei intercettare l'oggetto Response e rimuovere tutto l'HTML?

Qualche idea sul modo migliore per farlo? Dovrebbe essere abbastanza facile da codificare, ma sto cercando di capire come funziona.

risposta

5

C'è un modo corretto per configurare le rotte per questo compito

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

Tuttavia, questo sarebbe ancora richiedono di modificare ogni controller con strutture di controllo aggiuntive per gestire tale uscita.

Per risolvere questo problema, puoi fare due cose.

  1. creare modelli JSON per ogni modello che si possiede, quindi sostituire html in template.html.twig con template.'.$format.'.twig. (Fare attenzione a garantire che gli utenti non possano passare un parametro senza convalida nell'url, questo sarebbe un grave rischio per la sicurezza).

  2. Creare la propria classe di controller astratta e sovrascrivere il metodo di rendering per verificare il formato richiesto e fornire output basato su tale.

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

NOTA Il codice di cui sopra è un prototipo, non si aspettano di lavorare fuori dalla scatola.

Personalmente, ritengo più corretto il secondo metodo, perché non vi è alcuna duplicazione del codice e meno problemi di sicurezza.

+1

Ulteriori dettagli su * _format * http://symfony.com/doc/current/book/routing.html#advanced-routing-example – CSchulz

Problemi correlati