У меня был собственный REST API, отлично работающий с Drupal 8. После обновления до Drupal 9.2.X Пластырь и Публиковать методы этого пользовательского REST API перестали работать. Теперь они выдают следующее исключение.
RuntimeException: вызываемый "Drupal\my_module\Plugin\rest\resource\UpdateBoxes::patch" требует значения для аргумента "$payload". в Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (строка 143 файла /var/www/docroot/core/lib/Drupal/Component/Utility/ArgumentsResolver.php).
Код, который я использую, следующий.
пространство имен Drupal\my_module\Plugin\rest\resource;
используйте Drupal\rest\ModifiedResourceResponse;
/**
* Предоставляет ресурс для получения режимов просмотра по объектам и пакетам.
*
* @RestResource(
* id = "update_boxes",
* label = @Translation("Обновить поля"),
* uri_paths = {
* "canonical" = "/api/container/{container_id}/{type}/{product_id}/boxes"
* }
* )
*/
класс UpdateBoxes расширяет ResourceBase {
/**
* Текущий экземпляр пользователя.
*
* @var\Drupal\Core\Session\AccountProxyInterface
*/
защищенный $currentUser;
защищенный $boxesHandler;
защищенный $event_dispacher;
/**
* {@inheritdoc}
*/
общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
$instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$instance->currentUser = $container->get('current_user');
$instance->boxesHandler = $container->get('boxes.handler');
$instance->event_dispacher = $container->get('event_dispatcher');
вернуть $экземпляр;
}
/**
* Отвечает на запросы PATCH.
*
* @параметр $container_id
* @параметр $тип
* @параметр $product_id
* @param $полезная нагрузка
* @return \Drupal\rest\ModifiedResourceResponse
* Объект ответа HTTP.
*/
патч общедоступной функции ($container_id = null, $type = null, $product_id = null, $payload) {
//Мой код здесь.
}
}
В пластырь()
я мог читать $ полезная нагрузка
и видим массив отправленный в запросе, но после обновления сайта, $ полезная нагрузка
является НОЛЬ
.
Решение, которое я нашел, заключалось в изменении последнего аргумента пластырь()
и извлечь полезную нагрузку из $запрос
объект.
Патч публичной функции ($container_id = null, $type = null, $product_id = null, Request $request) {
// ¦
$payload = json_decode($request->getContent(), TRUE);
}
Я не смог найти никакой документации об этом изменении; Я не уверен, что это была хорошая практика или лучшая реализация для работы полезной нагрузки.