Am avut un API REST personalizat care funcționează perfect cu Drupal 8. După actualizarea la Drupal 9.2.X, sistemul Plasture și Post metodele acestui API REST personalizat nu mai funcționează. Acum ei aruncă următoarea excepție.
RuntimeException: apelabil „Drupal\my_module\Plugin\rest\resource\UpdateBoxes::patch” necesită o valoare pentru argumentul „$payload”. în Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (linia 143 din /var/www/docroot/core/lib/Drupal/Component/Utility/ArgumentsResolver.php).
Codul pe care îl folosesc este următorul.
spațiu de nume Drupal\modulul_meu\Plugin\rest\resursa;
utilizați Drupal\rest\ModifiedResourceResponse;
/**
* Oferă o resursă pentru a obține moduri de vizualizare în funcție de entitate și pachet.
*
* @RestResource(
* id = "update_boxes",
* etichetă = @Translation(„Casutele de actualizare”),
* uri_paths = {
* „canonic” = „/api/container/{container_id}/{type}/{product_id}/boxes”
*}
* )
*/
clasa UpdateBoxes extinde ResourceBase {
/**
* O instanță de utilizator actuală.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protejat $currentUser;
protejat $boxesHandler;
protejat $event_dispacher;
/**
* {@inheritdoc}
*/
funcția publică statică create(ContainerInterface $container, matrice $configurație, $plugin_id, $plugin_definition) {
$instanta = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$instance->currentUser = $container->get('current_user');
$instanta->boxesHandler = $container->get('boxes.handler');
$instanță->event_dispacher = $container->get('event_dispatcher');
returnare $instanță;
}
/**
* Răspunde la solicitările PATCH.
*
* @param $container_id
* @param $type
* @param $product_id
* @param $sarcină utilă
* @return \Drupal\rest\ModifiedResourceResponse
* Obiectul răspuns HTTP.
*/
patch-ul funcției publice ($container_id = null, $tip = null, $product_id = null, $payload) {
//Codul meu aici.
}
}
În plasture()
puteam citi $sarcină utilă
și vedeți matricea trimisă în cerere, dar după actualizarea site-ului, $sarcină utilă
este NUL
.
Soluția pe care am găsit-o a fost schimbarea ultimului argument al plasture()
și extrageți sarcina utilă din $cerere
obiect.
patch-ul funcției publice($container_id = null, $tip = null, $product_id = null, Solicitare $request) {
// â¦
$payload = json_decode($request->getContent(), TRUE);
}
Nu am găsit nicio documentație despre această modificare; Nu sunt sigur că a fost o practică bună sau o implementare mai bună pentru ca sarcina utilă să funcționeze.