Din motive complicate și neplăcute[*], vreau să încorporez datele de entitate din modulul JSONAPI în interiorul JSON returnat dintr-o resursă de modul REST.
Încerc să fac acest lucru făcând o subcerere HTTP către ruta modulului JSONAPI din clasa de resurse a modulului REST.
Ca aceasta:
$kernel = \Drupal::service('http_kernel');
$cerere_curente = \Drupal::cerere();
$request = Request::create('/jsonapi/paragraph/' . $paragraph->bundle() . '/' . $paragraph->uuid->value);
$request->setSession($current_request->getSession());
$răspuns = $kernel->handle($cerere, HttpKernelInterface::SUB_REQUEST);
$json = $răspuns->getContent();
$date = json_decode($json, TRUE);
Primesc datele pe care le doresc și sunt grozav!
Cu toate acestea, cererea principală către punctul final al resursei REST se blochează cu aceasta:
Symfony\Component\Serializer\Exception\NotEncodableValueException: Serializarea pentru formatul „api_json” nu este acceptată. în Symfony\Component\Serializer\Serializer->serialize() (linia 112 din /var/www/vendor/symfony/serializer/Serializer.php).
Acest lucru se datorează faptului că în Drupal\rest\EventSubscriber\ResourceResponseSubscriber->getResponseFormat(), $route = $route_match->getRouteObject();
este ruta modulului JSONAPI de la subcerere și nu ruta de la cererea principală.
Ce greșesc cu cererea mea secundară?
[*] O cantitate enormă de cod personalizat care alimentează o resursă REST pentru un front end decuplat. Vreau să-l schimb folosind JSONAPI, dar este o schimbare masivă cu repercusiuni uriașe pe front-end. Pentru a trece treptat la JSONAPI, vreau să schimb unele tipuri de paragraf la formatul JSONAPI. Ar putea apela direct codul PHP al modulului JSONAPI, dar asta este nu este un API public și astfel versiunile viitoare ale Drupal l-ar putea rupe. Efectuarea unei subcereri înseamnă utilizarea API-ului și, prin urmare, mai ușor de întreținut.