master

laravel/framework

Last updated at: 29/12/2023 09:22

JsonResponse.php

TLDR

The JsonResponse.php file is a part of the Illuminate\Http namespace. It extends the Symfony\Component\HttpFoundation\JsonResponse class and adds extra functionality to handle JSON responses in the Laravel framework. The file defines the JsonResponse class, which provides methods for creating and manipulating JSON responses.

Methods

__construct

This method is the constructor of the JsonResponse class. It initializes a new JSON response instance. It accepts parameters for the data, status code, headers, JSON options, and a flag to indicate whether the data should be encoded as JSON.

fromJsonString

This method constructs a new JsonResponse instance from a JSON string. It accepts parameters for the JSON string, status code, and headers. It returns a new JsonResponse instance.

withCallback

This method sets the JSONP callback for the response. It accepts a callback string as a parameter and returns the current JsonResponse instance.

getData

This method retrieves the JSON-decoded data from the response. It accepts parameters to control the decoding behavior and returns the decoded data.

setData

This method sets the data for the response. It accepts the data to be set and returns the current JsonResponse instance. The method also performs JSON encoding on the data based on its type and encoding options.

hasValidJson

This method determines whether an error occurred during JSON encoding. It accepts the JSON error code as a parameter and returns a boolean indicating whether the JSON is valid.

setEncodingOptions

This method sets the JSON encoding options for the response. It accepts the options to be set and returns the current JsonResponse instance. The method also updates the data by re-encoding it with the new options.

hasEncodingOption

This method checks if a specific JSON encoding option is set. It accepts the option to be checked and returns a boolean indicating whether the option is set.

Classes

None

<?php

namespace Illuminate\Http;

use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Support\Traits\Macroable;
use InvalidArgumentException;
use JsonSerializable;
use Symfony\Component\HttpFoundation\JsonResponse as BaseJsonResponse;

class JsonResponse extends BaseJsonResponse
{
    use ResponseTrait, Macroable {
        Macroable::__call as macroCall;
    }

    /**
     * Create a new JSON response instance.
     *
     * @param  mixed  $data
     * @param  int  $status
     * @param  array  $headers
     * @param  int  $options
     * @param  bool  $json
     * @return void
     */
    public function __construct($data = null, $status = 200, $headers = [], $options = 0, $json = false)
    {
        $this->encodingOptions = $options;

        parent::__construct($data, $status, $headers, $json);
    }

    /**
     * {@inheritdoc}
     *
     * @return static
     */
    #[\Override]
    public static function fromJsonString(?string $data = null, int $status = 200, array $headers = []): static
    {
        return new static($data, $status, $headers, 0, true);
    }

    /**
     * Sets the JSONP callback.
     *
     * @param  string|null  $callback
     * @return $this
     */
    public function withCallback($callback = null)
    {
        return $this->setCallback($callback);
    }

    /**
     * Get the json_decoded data from the response.
     *
     * @param  bool  $assoc
     * @param  int  $depth
     * @return mixed
     */
    public function getData($assoc = false, $depth = 512)
    {
        return json_decode($this->data, $assoc, $depth);
    }

    /**
     * {@inheritdoc}
     *
     * @return static
     */
    #[\Override]
    public function setData($data = []): static
    {
        $this->original = $data;

        // Ensure json_last_error() is cleared...
        json_decode('[]');

        $this->data = match (true) {
            $data instanceof Jsonable => $data->toJson($this->encodingOptions),
            $data instanceof JsonSerializable => json_encode($data->jsonSerialize(), $this->encodingOptions),
            $data instanceof Arrayable => json_encode($data->toArray(), $this->encodingOptions),
            default => json_encode($data, $this->encodingOptions),
        };

        if (! $this->hasValidJson(json_last_error())) {
            throw new InvalidArgumentException(json_last_error_msg());
        }

        return $this->update();
    }

    /**
     * Determine if an error occurred during JSON encoding.
     *
     * @param  int  $jsonError
     * @return bool
     */
    protected function hasValidJson($jsonError)
    {
        if ($jsonError === JSON_ERROR_NONE) {
            return true;
        }

        return $this->hasEncodingOption(JSON_PARTIAL_OUTPUT_ON_ERROR) &&
                    in_array($jsonError, [
                        JSON_ERROR_RECURSION,
                        JSON_ERROR_INF_OR_NAN,
                        JSON_ERROR_UNSUPPORTED_TYPE,
                    ]);
    }

    /**
     * {@inheritdoc}
     *
     * @return static
     */
    #[\Override]
    public function setEncodingOptions($options): static
    {
        $this->encodingOptions = (int) $options;

        return $this->setData($this->getData());
    }

    /**
     * Determine if a JSON encoding option is set.
     *
     * @param  int  $option
     * @return bool
     */
    public function hasEncodingOption($option)
    {
        return (bool) ($this->encodingOptions & $option);
    }
}