Cum să suprascrii o resursă REST din Drupal Core
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_auth4. 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
- Menține întotdeauna compatibilitatea cu versiunile anterioare, când este posibil
- Documentează temeinic endpoint-urile tale personalizate
- Implementează controale de acces adecvate
- Adaugă gestionarea completă a erorilor
- Utilizează injecția de dependență în loc de apeluri de servicii statice
- Adaugă validarea corespunzătoare a cererilor
- 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.
 
