Điểm:1

Tạo một yêu cầu phụ HTTP khiến cho CurrentRouteMatch có tuyến đường sai

lá cờ by

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.

Jaypan avatar
lá cờ de
Tại sao bạn lại thực hiện một yêu cầu phụ mà không sử dụng ứng dụng khách Guzzle HTTP để thực hiện yêu cầu của mình?
lá cờ by
Ai đó đã gợi ý tôi sử dụng yêu cầu con Symfony trong Slack. Không phải ứng dụng khách Guzzle HTTP có nghĩa là một yêu cầu riêng biệt thực sự đối với máy chủ sao? Có RẤT NHIỀU thực thể đoạn liên quan, do đó, việc thêm các yêu cầu HTTP thực tế có lẽ sẽ không tốt cho hiệu suất.
lá cờ by
Đã cập nhật câu hỏi để giải thích rõ hơn rằng tôi muốn đặt dữ liệu JSON từ dữ liệu này sang dữ liệu khác.
Điểm:2
lá cờ cn

Sau khi chạy yêu cầu phụ, ngăn xếp yêu cầu khá lộn xộn, nó vẫn chứa yêu cầu phụ trong khi ngăn xếp khớp tuyến đã được dọn sạch. Sau đó, nếu bạn nhận được kết quả khớp tuyến hiện tại, điều này sẽ trả về kết quả khớp tuyến mới được tạo dựa trên yêu cầu api json.

Cách khắc phục nhanh là dọn sạch ngăn xếp yêu cầu theo cách thủ công, bao gồm kiểm tra để mã vẫn hoạt động khi sự cố cốt lõi được khắc phục:

$current_request = \Drupal::request();

$request = Request::create('/jsonapi/node/page/UUID', 'GET', [], $current_request->cookies->all(), [], $current_request->server->all() );
$request->setSession($current_request->getSession());


$response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
if (\Drupal::request()->getPathInfo() !== $current_request->getPathInfo()) {
  \Drupal::requestStack()->pop();
}

BTW yêu cầu phụ của bạn có thể cần thêm siêu dữ liệu từ yêu cầu chính. Tôi đã thêm cookie và tiêu đề máy chủ vào ví dụ về mã.

lá cờ by
Chính xác là như vậy -- tuyến đường khớp với yêu cầu con đang làm ô nhiễm mọi thứ. Đó có phải là lỗi cốt lõi không và có vấn đề gì với nó không? Tôi đã có tất cả làm việc bây giờ, cảm ơn bạn!! :)
lá cờ by
Không thể tìm thấy sự cố hiện có, đã gửi https://www.drupal.org/project/drupal/issues/3218022.
Điểm:1
lá cờ by

Kể từ đó, tôi đã phát hiện ra rằng mô-đun jsonapi_extras cung cấp chức năng chính xác giống như vậy -- nhận biểu diễn JSONAPI của một thực thể bằng cách thực hiện một yêu cầu con. Điều đó dường như để tránh vấn đề bằng cách sử dụng http_kernel.basic service để thực hiện yêu cầu con. Có vẻ như điều đó không giữ được ngăn xếp yêu cầu, vì vậy bỏ qua vấn đề nhiều yêu cầu được theo dõi?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.