Vì những lý do phức tạp và khó chịu[*], tôi muốn nhúng dữ liệu thực thể từ mô-đun JSONAPI vào bên trong JSON được trả về từ tài nguyên mô-đun REST.
Tôi đang cố gắng thực hiện điều này bằng cách tạo một yêu cầu con HTTP cho tuyến mô-đun JSONAPI trong lớp tài nguyên mô-đun REST.
Như thế này:
$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 = $response->getContent();
$data = json_decode($json, TRUE);
Tôi nhận được dữ liệu tôi muốn và nó thật tuyệt!
Tuy nhiên, yêu cầu chính đối với điểm cuối tài nguyên REST gặp sự cố với điều này:
Symfony\Component\Serializer\Exception\NotEncodableValueException: Việc tuần tự hóa cho định dạng "api_json" không được hỗ trợ. trong Symfony\Component\Serializer\Serializer->serialize() (dòng 112 của /var/www/vendor/symfony/serializer/Serializer.php).
Điều này là do trong Drupal\rest\EventSubscriber\ResourceResponseSubscriber->getResponseFormat(), $route = $route_match->getRouteObject();
là tuyến mô-đun JSONAPI từ yêu cầu phụ chứ không phải tuyến từ yêu cầu chính.
Tôi đang làm gì sai với yêu cầu phụ của mình?
[*] Một lượng lớn mã tùy chỉnh cung cấp năng lượng cho tài nguyên REST cho giao diện người dùng được tách rời. Tôi muốn thay đổi nó thành sử dụng JSONAPI nhưng đó là một thay đổi lớn với những hậu quả lớn trên giao diện người dùng. Để thay đổi từng bước sang JSONAPI, tôi muốn chuyển một số loại đoạn văn sang định dạng JSONAPI. Có thể gọi trực tiếp mã PHP của mô-đun JSONAPI, nhưng đó là không phải là API công khai và vì vậy các phiên bản tương lai của Drupal có thể phá vỡ nó. Tạo một yêu cầu phụ đang sử dụng API và do đó dễ bảo trì hơn.