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.