По сложным и неприятным причинам[*] я хочу встроить данные сущности из модуля JSONAPI внутрь JSON, возвращаемого из ресурса модуля REST.
Я пытаюсь сделать это, отправив подзапрос HTTP к маршруту модуля JSONAPI в классе ресурсов модуля REST.
Как это:
$kernel = \Drupal::service('http_kernel');
$current_request = \Drupal::request();
$request = Request::create('/jsonapi/paragraph/' . $paragraph->bundle() . '/' . $paragraph->uuid->value);
$request->setSession($current_request->getSession());
$response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
$json = $ответ->getContent();
$data = json_decode($json, ИСТИНА);
Я получаю нужные мне данные, и это здорово!
Однако основной запрос к конечной точке ресурса REST завершается с ошибкой:
Symfony\Component\Serializer\Exception\NotEncodableValueException: Сериализация для формата "api_json" не поддерживается. в Symfony\Component\Serializer\Serializer->serialize() (строка 112 файла /var/www/vendor/symfony/serializer/Serializer.php).
Это связано с тем, что в Drupal\rest\EventSubscriber\ResourceResponseSubscriber->getResponseFormat(), $route = $route_match->getRouteObject();
— это маршрут модуля JSONAPI из подзапроса, а не маршрут из основного запроса.
Что я делаю не так с моим подзапросом?
[*] Огромное количество пользовательского кода, обеспечивающего работу ресурса REST для несвязанного внешнего интерфейса. Я хочу изменить его на использование JSONAPI, но это серьезное изменение с огромными последствиями для внешнего интерфейса. Чтобы постепенно перейти на JSONAPI, я хочу переключить некоторые типы абзацев на формат JSONAPI. Можно напрямую вызвать PHP-код модуля JSONAPI, но это не публичный API и поэтому будущие версии Drupal могут его сломать. Создание подзапроса использует API и поэтому более удобно в обслуживании.