Joomla Framework를 사용하여 JSON 반환


11

Joomla Framework를 사용하여 웹 애플리케이션을 구축하기 시작했습니다 . AJAX로 컨텐츠를 업데이트하는 데 사용되는 API와 함께 iFrame에 표시되는 간단한 웹 페이지로 구성됩니다.

Composer와 Joomla 시작하기를 따랐습니다 ! 기사를 작성하고 Framework 앱을 시작하고 실행하십시오. iFrame에서 작동하도록 기본 HTML 출력을 사용자 정의하고 API를 시작했습니다. News를 템플릿으로 사용하고 API에 대한 컨트롤러, 모델, 테이블 및 뷰를 만들었습니다. 그런 다음 매우 간단한 Twig 템플릿을 만들어 내 데이터의 JSON 표현을 다음과 같이 반환합니다.

{{ items|json_encode|raw }}

지금까지는 좋지만 jQuery와 함께 AJAX를 사용할 때 문제가 발생하는이 헤더가 반환됩니다.

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

나는 이것을 추가하는 간단한 경우라고 생각했지만 어디에 두어도 반환 된 헤더는 변경되지 않습니다.

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

setHeader가 이름을 변경하는 것처럼 작동한다는 것을 알고 새 헤더가 반환되는 것을 볼 수 있습니다. 따라서 실행 후 나중에 덮어 쓰는 것으로 가정합니다.

그래서 내 질문은, 나는 이것에 대해 올바른 방법으로 가고 있습니까? 내보기가 잘못되었다고 생각되는 DefaultHtmlView를 확장합니다. DefaultJsonView를 만들어야합니까? 올바른 Content-Type을 설정하거나 JSON을 반환하는 더 좋은 방법이 있습니까?

Joomla Framework를 사용하여 API를 빌드하는 가장 좋은 방법에 대한 조언은 크게 감사하겠습니다.

답변:


6

나는 이것이 "올바른"방법으로 보이는 것을 마침내 발견했다. sendHeaders를 사용해도 추가 Content-Type이 추가되고 나중에 추가 될 때 반환되었습니다.

코드를 따르고 AbstractWebApplication.php는 다음 행으로 헤더를 설정합니다.

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

그래서 내 코드에서 이것을 사용하여 내 mimeType을 정의 할 수있었습니다.

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

이제 올바른 헤더가 반환되고 jQuery는 출력을 JSON으로 이해합니다!


3

조금 파고 들었지만 문제가 보입니다.

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

setHeader 함수를 보면 실제로 헤더를 설정하지 않고 "준비"됩니다.

그래서 당신이해야 할 일은 간단합니다

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

sendHeaders()헤더를 "준비"하는 것이 아니라 추가 기능 을 연결하여 헤더를 설정할 수 있습니다.

exit;더 이상의 실행을 방지하고 JSON을 출력하기 위해 사용했을 가능성이 높 으므로 sendHeaders 함수가 실행되지 않을 가능성이 높습니다.


제안 해 주셔서 감사합니다. 불행히도 sendHeaders를 사용한 이유조차도 여전히 Content-Type을 덮어 쓰기 시작했습니다. exit를 사용하려고했지만 템플릿이 렌더링되지 않아 출력이 없습니다. 답변으로 게시 한 솔루션을 찾았습니다.
— Joe P

글쎄, 다른 솔루션을 추가 할 것입니다. 그래서 누군가가 필요로하는 사람에게도 잘 작동합니다. 사용 exit하면 더 이상 아무것도 실행되지 않고 현재 상태 그대로 출력해야합니다. 그래도 대답은 훨씬 나아 보입니다.
— Jordan Ramstad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.