Как включить симпатичную печать 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, которые могут помочь вам в этом, и это будет гораздо более простым решением.

Другие вопросы по тегам