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
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.