Как включить симпатичную печать Json в ответе Apigility ApiProblem?
Я хотел бы знать, как установить ответ ApiProblem для печати Json по умолчанию.
2 ответа
Я сделал несколько изменений в классе ApiProblemResponse
, Я установил собственность $jsonFlags
до 128, что связано с JSON_PRETTY_PRINT
код.
Вот полный код класса с моими изменениями:
<?php
namespace Zend\ApiProblem;
use Zend\Http\Response;
/**
* Represents an ApiProblem response payload
*/
class ApiProblemResponse extends Response
{
/**
* @var ApiProblem
*/
protected $apiProblem;
/**
* Flags to use with json_encode JSON_PRETTY_PRINT
*
* @var int
*/
protected $jsonFlags = 128;
/**
* @param ApiProblem $apiProblem
*/
public function __construct(ApiProblem $apiProblem)
{
$this->apiProblem = $apiProblem;
$this->setCustomStatusCode($apiProblem->status);
$this->setReasonPhrase($apiProblem->title);
// Just comment/remove these lines to prevent flags from being overwrited
//if (defined('JSON_UNESCAPED_SLASHES')) {
//$this->jsonFlags = constant('JSON_UNESCAPED_SLASHES');
//}
}
/**
* @return ApiProblem
*/
public function getApiProblem()
{
return $this->apiProblem;
}
/**
* Retrieve the content
*
* Serializes the composed ApiProblem instance to JSON.
*
* @return string
*/
public function getContent()
{
return json_encode($this->apiProblem->toArray(), $this->jsonFlags);
}
/**
* Retrieve headers
*
* Proxies to parent class, but then checks if we have an content-type
* header; if not, sets it, with a value of "application/problem+json".
*
* @return \Zend\Http\Headers
*/
public function getHeaders()
{
$headers = parent::getHeaders();
if (!$headers->has('content-type')) {
$headers->addHeaderLine('content-type', 'application/problem+json');
}
return $headers;
}
/**
* Override reason phrase handling
*
* If no corresponding reason phrase is available for the current status
* code, return "Unknown Error".
*
* @return string
*/
public function getReasonPhrase()
{
if (! empty($this->reasonPhrase)) {
return $this->reasonPhrase;
}
if (isset($this->recommendedReasonPhrases[$this->statusCode])) {
return $this->recommendedReasonPhrases[$this->statusCode];
}
return 'Unknown Error';
}
}
Внутри моего контроллера я использовал:
return new ApiProblemResponse(
new ApiProblem(ApiProblemResponse::STATUS_CODE_501, 'Example of JSON_PRETTY_PRINT response.')
);
И сделал трюк:
{
"type": "http:\/\/www.w3.org\/Protocols\/rfc2616\/rfc2616-sec10.html",
"title": "Not Implemented",
"status": 501,
"detail": "Example of JSON_PRETTY_PRINT response."
}
E сть HalJsonStrategy
используется для рендеринга в ZF-Hal. Эта стратегия расширяет стандартную ZF2 JsonStrategy
, Эта стратегия визуализирует модели типа HalJsonModel
который расширяет ZF2 по умолчанию JsonModel
учебный класс. Рендеринг происходит с HalJsonRenderer
который расширяет ZF2 по умолчанию JsonRenderer
учебный класс.
Вы можете настроить все это, изменив стратегию рендеринга на какую-то собственную стратегию или иным образом, установив другой рендерер (пользовательский, расширяющий существующий) внутри HalJsonStrategy
,
Не уверен, что это лучший способ.
Поскольку вся эта логика рендеринга hal-json построена поверх логики рендеринга json в ZF2 по умолчанию, вполне возможно изменить способ, которым текущий рендерер выводит ваш json, просто изменив конфигурацию, как это обычно делается в ZF2, чтобы получить довольно вывод на печать.
Может быть, эта страница поможет вам достичь того, чего вы хотите.
Резюме:
То, что сводится к обмену Json::encode
позвонить в render
метод в JsonRenderer
класс (или вызов рендеринга) в Json::prettyPrint
Примечание. Возможно, причина в том, что вы просматриваете код json в окне вашего браузера в удобочитаемой форме. Есть много плагинов JSON, которые могут помочь вам в этом, и это будет гораздо более простым решением.