back

Knowlegde

Knowledge Centre

Cum să suprascrii o resursă REST din Drupal Core

by editor | 25.02.2025

Cum să suprascrii o resursă REST din Drupal Core

Uneori, proiectele ne cer să găsim soluții inovatoare. Recent, am avut nevoie să suprascriem o resursă REST din nucleul Drupal 8, și având în vedere documentația limitată disponibilă, am decis să împărtășim soluția noastră.

Premisele unei suprascieri în Drupal 8

Drupal 8 gestionează configurația într-un mod unificat, cu mai multe funcționalități stocate în nucleu decât în versiunile anterioare. Această alegere arhitecturală înseamnă că suprascrierea funcționalităților din nucleu necesită o atenție deosebită pentru a evita deteriorarea sistemului.

În timp ce Drupal 8 suportă suprascrierea globală `$config` prin `Drupal\Core\Config\ConfigFactory::get()`, suprascrierea resurselor REST necesită o abordare diferită. Nucleul Drupal 8 oferă resurse REST de bază pentru entitățile sistemului, dar operațiunile complexe necesită adesea extinderea acestor clase de bază.

Ghid pas cu pas pentru a suprascrie o resursă REST

1. Creează o nouă clasă

Mai întâi, creează o clasă care extinde clasa `EntityResource`:

namespace Drupal\my_module\Plugin\rest\resource;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Drupal\node\Entity\Node;
/**
* @RestResource(
*   id = "my_custom_node_rest_resource",
*   label = @Translation("Custom Node REST Resource"),
*   uri_paths = {
*     "canonical" = "/api/v1/node/{node}",
*     "create" = "/api/v1/node"
*   }
* )
*/
class MyCustomNodeResource extends EntityResource {
....
}

2. Implementează metodele necesare

Suprascrie metodele necesare din clasa părinte:

/**
  * Răspunde la cererile POST.
  *
  * @param array $data
  *   Datele cererii.
  *
  * @return \Drupal\rest\ResourceResponse
  *   Răspunsul care conține nodul.
  */
 public function post($data) {
   // Logica ta personalizată pentru POST aici
   $response = new ResourceResponse($result, 201);
   return $response;
 }
 /**
  * Răspunde la cererile PATCH.
  *
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   Entitatea.
  * @param array $data
  *   Datele cererii.
  *
  * @return \Drupal\rest\ResourceResponse
  *   Răspunsul.
  */
 public function patch($entity, array $data) {
   // Logica ta personalizată pentru PATCH aici
   return new ResourceResponse($entity, 200);
 }

3. Configurează setările resurselor REST

Adaugă următoarele în configurația modulului tău:

# config/install/rest.resource.my_custom_node_rest_resource.yml
langcode: en
status: true
dependencies:
 module:
   - my_module
   - serialization
id: my_custom_node_rest_resource
plugin_id: my_custom_node_rest_resource
granularity: resource
configuration:
 methods:
   - GET
   - POST
   - PATCH
 formats:
   - json
 authentication:
   - basic_auth

4. Implementează controalele de acces

Adaugă verificarea corespunzătoare a accesului:

/**
  * {@inheritdoc}
  */
 public function access($operation, array $args = []) {
   $entity = isset($args['entity']) ? $args['entity'] : NULL;
   
   switch ($operation) {
     case 'create':
       return $this->checkCreateAccess();
     case 'update':
       return $this->checkUpdateAccess($entity);
     default:
       return parent::access($operation, $args);
   }
 }
```
### 5. Gestionează excepțiile
Implementează gestionarea corespunzătoare a erorilor:
```php
 protected function handleException(\Exception $e) {
   watchdog_exception('my_module', $e);
   
   return new ResourceResponse([
     'error' => [
       'message' => $this->t('A apărut o eroare în timpul procesării cererii.'),
       'code' => 500,
     ],
   ], 500);
 }

Bune practici

  1. Menține întotdeauna compatibilitatea cu versiunile anterioare, când este posibil
  2. Documentează temeinic endpoint-urile tale personalizate
  3. Implementează controale de acces adecvate
  4. Adaugă gestionarea completă a erorilor
  5. Utilizează injecția de dependență în loc de apeluri de servicii statice
  6. Adaugă validarea corespunzătoare a cererilor
  7. Include antetele de răspuns adecvate

Testarea resursei tale personalizate

Adaugă teste PHPUnit pentru a te asigura că resursa ta funcționează conform așteptărilor:

namespace Drupal\Tests\my_module\Functional;
use Drupal\Tests\rest\Functional\ResourceTestBase;
class MyCustomNodeResourceTest extends ResourceTestBase {
 // Implementarea testului
}
Capcane comune de evitat
  • Negestionarea corespunzătoare a tuturor metodelor HTTP
  • Uitarea actualizării configurației REST după modificări
  • Gestionarea inadecvată a erorilor
  • Controale de acces lipsă
  • Nevalidarea datelor de intrare
  • Formatarea incorectă a răspunsurilor

Urmând acești pași și aceste bune practici, poți suprascrie cu succes resursele REST din nucleul Drupal 8, menținând în același timp stabilitatea și securitatea sistemului.

override-rest-drupal-core _0.jpg
Top
  • Knowlegde
    Knowledge Centre
    Extinde validarea câmpurilor cu expresii regulate
    editor
  • Knowlegde
    Knowledge Centre
    Înțelegerea arhitecturii CMS decuplate complet vs. decuplate progresiv
    editor
  • Knowlegde
    Knowledge Centre
    AngularJS sau Angular: Înțelegerea diferențelor și luarea deciziei corecte
    editor