it-swarm-id.com

Kembalikan JSON menggunakan Kerangka Joomla

Saya sudah mulai membangun aplikasi web menggunakan Joomla Framework . Ini terdiri dari halaman web sederhana yang akan ditampilkan dalam iFrame bersama dengan API yang akan digunakan untuk memperbarui konten dengan AJAX.

Saya mengikuti Memulai dengan Composer dan Joomla! artikel dan memiliki Framework App dan berjalan. Saya telah mengkustomisasi output HTML default agar berfungsi untuk iFrame saya dan telah memulai API. Saya menggunakan Berita sebagai templat dan membuat pengontrol, model, tabel, dan tampilan untuk API saya yang semuanya berfungsi dengan baik. Saya kemudian membuat template Twig yang sangat sederhana yang mengembalikan representasi JSON dari data saya seperti ini:

{{ items|json_encode|raw }}

Sejauh ini bagus tapi saya mendapatkan header ini kembali yang akan menyebabkan masalah saat menggunakan AJAX dengan jQuery:

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

Saya pikir ini akan menjadi kasus sederhana untuk menambahkan ini tetapi di mana pun saya meletakkannya, itu tidak mengubah header yang dikembalikan:

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

Saya tahu bahwa setHeader berfungsi seolah-olah saya mengubah nama, saya melihat header baru kembali jadi saya berasumsi bahwa itu sedang ditimpa nanti dalam eksekusi.

Jadi pertanyaan saya adalah, apakah saya akan melakukan ini dengan cara yang benar? Tampilan saya memperluas DefaultHtmlView yang terasa salah, haruskah saya membuat DefaultJsonView? Bagaimana saya bisa menetapkan Tipe Konten yang benar atau apakah ada pendekatan yang lebih baik untuk mengembalikan JSON?

Setiap bantuan saran yang dapat diberikan tentang cara terbaik untuk menggunakan Kerangka Joomla untuk membangun API akan sangat dihargai.

11
Joe P

Saya akhirnya menemukan apa yang tampaknya menjadi cara yang "benar" untuk melakukan ini. Bahkan jika saya menggunakan sendHeaders, Content-Type tambahan sedang ditambahkan dan dikembalikan seperti yang ditambahkan kemudian.

Saya mengikuti kode dan AbstractWebApplication.php menetapkan header dengan baris ini:

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

Jadi saya dapat mendefinisikan mimeType saya sendiri dengan menggunakan ini dalam kode saya:

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

Sekarang header yang benar akan dikembalikan dan jQuery memahami output sebagai JSON!

6
Joe P

Butuh sedikit menggali tetapi saya melihat masalah

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

Jika Anda melihat fungsi setHeader itu belum benar-benar mengatur header, itu hanya membuatnya "siap"

Jadi yang perlu Anda lakukan adalah sederhana

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

Fungsi ekstra sendHeaders() dapat dirantai untuk memungkinkan Anda mengatur tajuk, bukan hanya "menyiapkan" saja.

Dengan kemungkinan besar menggunakan exit; untuk mencegah eksekusi lebih lanjut dan menampilkan JSON, fungsi sendHeaders kemungkinan besar tidak berjalan.

3
Jordan Ramstad