Een eigen resource voor een custom entity creeëren

Drupal tip
Drupal tip

Een eigen resource voor een custom entity creeëren

Een custom entity aanmaken in Drupal 8 is zeer simpel geworden. Een korte wizard doorlopen en je eigen entity is klaar voor gebruik. Verder voorziet drupal 8 voor elke entity een REST integratie met bijhorende toegangsrechten. Maar wat als deze standaard implementatie niet voldoet aan jouw eisen? Ontdek hier hoe deze op een goede manier kan aangepast worden.

Om de standaard REST functionaliteit van een custom entity aan te passen, moet er een eigen Resource class aangemaakt worden die de EntityResource class extend. Zo wordt alle standaard drupal functionaliteit behouden en kan er eigen functionaliteit aan toegevoegd worden. Dit kan je doen als volgt:

1. Creeër een class in je module in src/Plugin/rest/resource en laat deze EntityResource extenden


class MyCustomEntityResource extends EntityResource {
 ...
}

2. Voeg de bijhorende annotation bovenaan de class toe. Op deze manier laat je drupal weten dat dit om een resource class gaat.

De annotation definieert verschillende properties van de resource: Label, over welke entity het gaat en de uri's waarop de REST calls beschikbaar moeten zijn.


/**
 * @RestResource(
 *   id = "my_custom_entity_resource",
 *   label = @Translation("My custom entity resource"),
 *   entity_type = "my_custom_entity_id",
 *   serialization_class = "Drupal\my_module\Entity\MyCustomEntityResource",
 *   uri_paths = {
 *     "canonical" = "/api/my-custom-entity/{my_custom_entity_id}",
 *     "https://www.drupal.org/link-relations/create" = "/api/create/my-custom-entity/my_custom_entity_id"
 *   }
 * )
 */
class MyCustomEntityResource extends EntityResource {
...

3. Implementeer de methodes die je wilt overschrijven/aanpassen


class MyCustomEntityResource extends EntityResource {
  /**
   * {@inheritdoc}
   */
  public function post(EntityInterface $entity= NULL) {
    // Let parent create new entity.
    $response = parent::post($entity);

    // Do own fancy stuff.


    // Return newly created entity.
    $url = $entity->urlInfo('canonical', ['absolute' => TRUE])->toString(TRUE);
    return new ResourceResponse($entity, 201, ['Location' => $url->getGeneratedUrl()]);
  }
...

Hier overschrijven we enkel de POST methode en laten we alle andere calls (GET, PUT, DELETE, ...) afhandelen door de parent class.

 

Deze manier van werken zorgt ervoor dat bij toekomstige drupal core REST updates alles perfect zal blijven werken.

Blijf op de hoogte via onze nieuwsbrief