Как передать параметры в функцию json_encode в компоненте Symfony Serializer

Вот ситуация: я работаю над API отдыха, основанным на symfony3, он использует FOSRestBundle и компонент сериализатора symfony, поэтому методы возвращают массив, а FOSRest обрабатывает кодирование и ответ. Проблема заключается в том, что сериализатор использует json_encode с настройками по умолчанию и API возвращает данные типа ‘\ u00c9S’ для некоторых символов. Поэтому мне нужно как-то передать JSON_UNESCAPED_UNICODE в json_encode (). Есть ли правильный способ достичь этой цели?
Пример метода:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use FOS\RestBundle\Controller\Annotations as Rest;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Symfony\Component\HttpFoundation\Request;

/**
* Class ExampleController
* @package AppBundle\Controller
*/
class ExampleController extends Controller
{
/**
* @Rest\Get("/get-some-data")
* @param Request $request
* @return array
*/
public function getSomeDataAction(Request $request)
{
$someData = [
'prop1' => 'Value',
'prop2' => 'Value',
'prop3' => 'Value',
'prop4' => 'Value',
];

return $someData;
}

Поэтому, когда я запрашиваю ‘/ get-some-data’, он возвращает меня:

{"prop1":"Value with \/","prop2":"Value with \u00c9"}

, но мне нужно это вернуть:

{"prop1":"Value with /","prop2":"Value with É"}

1

Решение

Вы можете использовать кодировщик, как найдено Вот и в документация

<?php
$encoder = new JsonEncoder(new JsonEncode(JSON_UNESCAPED_UNICODE), new JsonDecode(false));
$normalizer = new ObjectNormalizer();
$serializer = new Serializer(array($normalizer), array($encoder));

РЕДАКТИРОВАТЬ:

В этом примере я использую объект Response. Обратите внимание, что контроллер действий должен вернуть отклик объект.

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use FOS\RestBundle\Controller\Annotations as Rest;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Symfony\Component\HttpFoundation\Request;

/**
* Class ExampleController
* @package AppBundle\Controller
*/
class ExampleController extends Controller
{
/**
* @Rest\Get("/get-some-data")
* @param Request $request
* @return array
*/
public function getSomeDataAction(Request $request)
{
$someData = [
'prop1' => 'Value',
'prop2' => 'Value',
'prop3' => 'Value',
'prop4' => 'Value',
];
$response = new Response($someData);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
1

Другие решения

Я использую Symfony 3 и «Doctrine JSON ODM Bundle» для хранения своих данных в виде документа JSON. У меня такая же проблема. Все данные, которые содержали символы юникода, были автоматически экранированы, что было не тем, что я хотел.

После некоторых экспериментов мне наконец удалось пройти JSON_UNESCAPED_UNICODE возможность json_encode(),
Ниже мое решение:

# config/services.yml

serializer.encode.json.unescaped:
class: Symfony\Component\Serializer\Encoder\JsonEncode
arguments:
- !php/const JSON_UNESCAPED_UNICODE

serializer.encoder.json:
class: Symfony\Component\Serializer\Encoder\JsonEncoder
arguments:
- '@serializer.encode.json.unescaped'
1

По вопросам рекламы [email protected]