Restituisci JSON usando Joomla Framework


11

Ho iniziato a creare un'applicazione Web usando Joomla Framework . Consiste in una semplice pagina Web che verrà visualizzata in un iFrame insieme a un'API che verrà utilizzata per aggiornare il contenuto con AJAX.

Ho seguito la guida introduttiva a Composer e Joomla! articolo e avere l' App Framework attiva e funzionante. Ho personalizzato l'output HTML predefinito in modo che funzioni per il mio iFrame e ho iniziato l'API. Ho usato News come modello e ho creato un controller, un modello, una tabella e una vista per la mia API che funziona alla grande. Ho quindi creato un modello Twig molto semplice che restituisce una rappresentazione JSON dei miei dati in questo modo:

{{ items|json_encode|raw }}

Fin qui tutto bene, ma ho restituito questa intestazione che causerà problemi quando si utilizza AJAX con jQuery:

Content-Type:text/html; charset=utf-8

Ho pensato che sarebbe stato un semplice caso di aggiungere questo, ma non importa dove l'ho messo, non cambia l'intestazione che viene restituita:

$this->app->setHeader('Content-Type', 'application/json', true);

So che setHeader funziona come se cambiassi il nome, vedo la nuova intestazione restituita, quindi presumo che verrà sovrascritto più avanti nell'esecuzione.

Quindi la mia domanda è: sto andando nel modo giusto? La mia vista estende DefaultHtmlView che sembra sbagliato, dovrei creare un DefaultJsonView? Come posso impostare il Content-Type corretto o esiste un approccio migliore per la restituzione di JSON?

Qualsiasi aiuto di consulenza che può essere dato sul modo migliore di utilizzare Joomla Framework per costruire un'API sarà molto apprezzato.

Risposte:


6

Alla fine ho trovato quello che sembra essere il modo "corretto" per farlo. Anche se avessi usato sendHeaders, veniva aggiunto il tipo di contenuto aggiuntivo che veniva restituito come aggiunto successivamente.

Ho seguito il codice e AbstractWebApplication.php imposta le intestazioni con questa riga:

// Send the content-type header.
$this->setHeader('Content-Type', $this->mimeType . '; charset=' . $this->charSet);

Quindi sono stato in grado di definire il mio mimeType usando questo nel mio codice:

$this->app->mimeType = 'application/json';

Ora viene restituita l'intestazione corretta e jQuery comprende l'output come JSON!


3

Ho preso un po 'di scavo ma vedo il problema

https://github.com/joomla-framework/application/blob/master/src/AbstractWebApplication.php

Se guardi la funzione setHeader in realtà non imposta ancora l'intestazione, la ottiene solo "pronta"

Quindi quello che devi fare è semplice

$this->app->setHeader('Content-Type', 'application/json', true)->sendHeaders();

La funzione extra sendHeaders()può essere concatenata per consentire di impostare le intestazioni, non solo di "prepararle".

Con molto probabilmente l'utilizzo exit;per prevenire ulteriori esecuzioni e l'output di JSON la funzione sendHeaders molto probabilmente non è in esecuzione.


Grazie per il tuo suggerimento Sfortunatamente, anche perché ho usato sendHeaders, il tipo di contenuto è stato comunque iniziato a sovrascrivere. Ho provato a utilizzare exit ma non ho ricevuto output poiché il modello non era stato visualizzato. Ho trovato una soluzione che ho pubblicato come risposta.
Joe P

Bene, aggiungerò un'altra soluzione, solo così la mia funziona anche per chiunque ne abbia bisogno. Se lo usi exit, dovresti impedire l'esecuzione di qualcosa di più e limitarti a riprodurlo come è attualmente. La tua risposta sembra molto meglio però.
Jordan Ramstad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.