function EntityResource::patch

Same name in other branches
  1. 9 core/modules/rest/src/Plugin/rest/resource/EntityResource.php \Drupal\rest\Plugin\rest\resource\EntityResource::patch()
  2. 8.9.x core/modules/rest/src/Plugin/rest/resource/EntityResource.php \Drupal\rest\Plugin\rest\resource\EntityResource::patch()
  3. 10 core/modules/rest/src/Plugin/rest/resource/EntityResource.php \Drupal\rest\Plugin\rest\resource\EntityResource::patch()

Responds to entity PATCH requests.

Parameters

\Drupal\Core\Entity\EntityInterface $original_entity: The original entity object.

\Drupal\Core\Entity\EntityInterface $entity: The entity.

Return value

\Drupal\rest\ModifiedResourceResponse The HTTP response object.

Throws

\Symfony\Component\HttpKernel\Exception\HttpException

File

core/modules/rest/src/Plugin/rest/resource/EntityResource.php, line 219

Class

EntityResource
Represents entities as resources.

Namespace

Drupal\rest\Plugin\rest\resource

Code

public function patch(EntityInterface $original_entity, ?EntityInterface $entity = NULL) {
    if ($entity == NULL) {
        throw new BadRequestHttpException('No entity content received.');
    }
    $definition = $this->getPluginDefinition();
    if ($entity->getEntityTypeId() != $definition['entity_type']) {
        throw new BadRequestHttpException('Invalid entity type');
    }
    // Overwrite the received fields.
    // @todo Remove $changed_fields in https://www.drupal.org/project/drupal/issues/2862574.
    $changed_fields = [];
    foreach ($entity->_restSubmittedFields as $field_name) {
        $field = $entity->get($field_name);
        // It is not possible to set the language to NULL as it is automatically
        // re-initialized. As it must not be empty, skip it if it is.
        // @todo Remove in https://www.drupal.org/project/drupal/issues/2933408.
        if ($entity->getEntityType()
            ->hasKey('langcode') && $field_name === $entity->getEntityType()
            ->getKey('langcode') && $field->isEmpty()) {
            continue;
        }
        if ($this->checkPatchFieldAccess($original_entity->get($field_name), $field)) {
            $changed_fields[] = $field_name;
            $original_entity->set($field_name, $field->getValue());
        }
    }
    // If no fields are changed, we can send a response immediately!
    if (empty($changed_fields)) {
        return new ModifiedResourceResponse($original_entity, 200);
    }
    // Validate the received data before saving.
    $this->validate($original_entity, $changed_fields);
    try {
        $original_entity->save();
        $this->logger
            ->notice('Updated entity %type with ID %id.', [
            '%type' => $original_entity->getEntityTypeId(),
            '%id' => $original_entity->id(),
        ]);
        // Return the updated entity in the response body.
        return new ModifiedResourceResponse($original_entity, 200);
    } catch (EntityStorageException $e) {
        throw new HttpException(500, 'Internal Server Error', $e);
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.