[HttpFoundation] Fix TypeError: Argument 1 passed to JsonResponse::setJson() must be of the type string, object given
This commit is contained in:
parent
31cbfdc36a
commit
7fcba9611d
@ -43,6 +43,10 @@ class JsonResponse extends Response
|
|||||||
{
|
{
|
||||||
parent::__construct('', $status, $headers);
|
parent::__construct('', $status, $headers);
|
||||||
|
|
||||||
|
if ($json && !\is_string($data) && !is_numeric($data) && !\is_callable([$data, '__toString'])) {
|
||||||
|
throw new \TypeError(sprintf('"%s": If $json is set to true, argument $data must be a string or object implementing __toString(), "%s" given.', __METHOD__, get_debug_type($data)));
|
||||||
|
}
|
||||||
|
|
||||||
if (null === $data) {
|
if (null === $data) {
|
||||||
$data = new \ArrayObject();
|
$data = new \ArrayObject();
|
||||||
}
|
}
|
||||||
@ -77,13 +81,13 @@ class JsonResponse extends Response
|
|||||||
* return JsonResponse::fromJsonString('{"key": "value"}')
|
* return JsonResponse::fromJsonString('{"key": "value"}')
|
||||||
* ->setSharedMaxAge(300);
|
* ->setSharedMaxAge(300);
|
||||||
*
|
*
|
||||||
* @param string|null $data The JSON response string
|
* @param string $data The JSON response string
|
||||||
* @param int $status The response status code
|
* @param int $status The response status code
|
||||||
* @param array $headers An array of response headers
|
* @param array $headers An array of response headers
|
||||||
*
|
*
|
||||||
* @return static
|
* @return static
|
||||||
*/
|
*/
|
||||||
public static function fromJsonString($data = null, $status = 200, $headers = [])
|
public static function fromJsonString($data, $status = 200, $headers = [])
|
||||||
{
|
{
|
||||||
return new static($data, $status, $headers, true);
|
return new static($data, $status, $headers, true);
|
||||||
}
|
}
|
||||||
|
@ -240,6 +240,44 @@ class JsonResponseTest extends TestCase
|
|||||||
|
|
||||||
$this->assertEquals('/**/ಠ_ಠ["foo"].bar[0]({"foo":"bar"});', $response->getContent());
|
$this->assertEquals('/**/ಠ_ಠ["foo"].bar[0]({"foo":"bar"});', $response->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testConstructorWithNullAsDataThrowsAnUnexpectedValueException()
|
||||||
|
{
|
||||||
|
$this->expectException(\TypeError::class);
|
||||||
|
$this->expectExceptionMessage('If $json is set to true, argument $data must be a string or object implementing __toString(), "null" given.');
|
||||||
|
|
||||||
|
new JsonResponse(null, 200, [], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testfromJsonStringConstructorWithNullAsDataThrowsAnUnexpectedValueException()
|
||||||
|
{
|
||||||
|
$this->expectException(\TypeError::class);
|
||||||
|
$this->expectExceptionMessage('If $json is set to true, argument $data must be a string or object implementing __toString(), "null" given.');
|
||||||
|
|
||||||
|
JsonResponse::fromJsonString(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConstructorWithObjectWithToStringMethod()
|
||||||
|
{
|
||||||
|
$class = new class() {
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return '{}';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$response = new JsonResponse($class, 200, [], true);
|
||||||
|
|
||||||
|
$this->assertSame('{}', $response->getContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConstructorWithObjectWithoutToStringMethodThrowsAnException()
|
||||||
|
{
|
||||||
|
$this->expectException(\TypeError::class);
|
||||||
|
$this->expectExceptionMessage('If $json is set to true, argument $data must be a string or object implementing __toString(), "stdClass" given.');
|
||||||
|
|
||||||
|
new JsonResponse(new \stdClass(), 200, [], true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interface_exists('JsonSerializable', false)) {
|
if (interface_exists('JsonSerializable', false)) {
|
||||||
|
@ -18,7 +18,8 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1.3",
|
"php": ">=7.1.3",
|
||||||
"symfony/mime": "^4.3|^5.0",
|
"symfony/mime": "^4.3|^5.0",
|
||||||
"symfony/polyfill-mbstring": "~1.1"
|
"symfony/polyfill-mbstring": "~1.1",
|
||||||
|
"symfony/polyfill-php80": "^1.15"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"predis/predis": "~1.0",
|
"predis/predis": "~1.0",
|
||||||
|
Reference in New Issue
Block a user