themichaelhall/bluemvc-core

View on GitHub
src/ActionResults/JsonResult.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/**
 * This file is a part of the bluemvc-core package.
 *
 * Read more at https://bluemvc.com/
 */

declare(strict_types=1);

namespace BlueMvc\Core\ActionResults;

use BlueMvc\Core\Exceptions\InvalidActionResultContentException;
use BlueMvc\Core\Http\StatusCode;
use BlueMvc\Core\Interfaces\ApplicationInterface;
use BlueMvc\Core\Interfaces\Http\StatusCodeInterface;
use BlueMvc\Core\Interfaces\RequestInterface;
use BlueMvc\Core\Interfaces\ResponseInterface;

/**
 * Class representing a JSON action result.
 *
 * @since 1.0.0
 */
class JsonResult extends ActionResult
{
    /**
     * Constructs the action result.
     *
     * @since 1.0.0
     *
     * @param mixed                    $content    The content.
     * @param StatusCodeInterface|null $statusCode The status code or null for status code 200 OK.
     *
     * @throws InvalidActionResultContentException If the content could not be json-encoded.
     */
    public function __construct($content, ?StatusCodeInterface $statusCode = null)
    {
        $json = json_encode($content);
        if ($json === false) {
            throw new InvalidActionResultContentException('Could not create JsonResult from content: ' . json_last_error_msg());
        }

        parent::__construct($json, $statusCode ?: new StatusCode(StatusCode::OK));
    }

    /**
     * Updates the response.
     *
     * @since 1.0.0
     *
     * @param ApplicationInterface $application The application.
     * @param RequestInterface     $request     The request.
     * @param ResponseInterface    $response    The response.
     */
    public function updateResponse(ApplicationInterface $application, RequestInterface $request, ResponseInterface $response): void
    {
        parent::updateResponse($application, $request, $response);

        $response->setHeader('Content-Type', 'application/json');
    }
}