Ռեսուրսների անհատականացում
Որոշ կայքեր կարող են չցանկանալ բացահայտել որոշակի JSON:API ռեսուրսների տիպեր կամ դաշտեր, կամ կարող են ցանկանալ վերանվանել դաշտերը՝ ավելի մաքուր ինտերֆեյս ապահովելու համար։
Այս փոփոխությունները թույլ տալու համար, JSON:API-ն օգտագործում է ResourceTypeBuildEvent
իրադարձության օբյեկտը՝ ResourceTypeBuildEvents::BUILD
իրադարձության անունով։ Տե՛ս իրադարձությունների բաժանորդագրվելու և ուղարկելու մասին՝ իմանալու ինչպես օգտագործել այս իրադարձությունները։
Բաժանորդագրվող մոդուլները կարող են կանչել հետևյալ մեթոդները՝
ResourceTypeBuildEvent::disableResourceType()
՝ ռեսուրսի տիպը ցանկացած եղանակով JSON:API-ով հասանելի դարձնելուց արգելափակելու համար։ResourceTypeBuildEvent::disableField()
՝ դաշտը ցանկացած եղանակով JSON:API-ով հասանելի դարձնելուց արգելափակելու համար։ResourceTypeBuildEvent::setPublicFieldName()
՝ դաշտի համար ալիաս սահմանելու համար, որպեսզի JSON:API-ն չբացահայտի ներքին Drupal դաշտի անունը։ResourceTypeBuildEvent::setResourceTypeName()
՝ ռեսուրսի տիպի անունը փոխելու համար, որպեսզի JSON:API-ն չբացահայտի ներքին ռեսուրսի անունը։
Ցանկացած մոդուլ՝ թե custom, թե contrib, կարող է իրադարձության բաժանորդագրման իր իրականացմանը ավելացնել այս մեթոդները։ Սա նշանակում է, որ կոնկրետ կայքի համար ստեղծված մոդուլը կարող է անջատել ռեսուրսի տիպեր, ինչպես նաև, որ իր սեփական էկզեմպլարները ստեղծող մոդուլները կարող են անջատել իրենց սեփական JSON:API ներկայացումները։
Օրինակ
Ստորև ներկայացված է EventSubscriber
-ի օրինակ, որտեղ ցուցադրված են բոլոր հնարավոր գործողությունները․
<?php
namespace Drupal\modules\custom\resource_types\EventSubscriber;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvents;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Event subscriber՝ որոշ ռեսուրսների տիպերը փոխելու համար։
*/
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
ResourceTypeBuildEvents::BUILD => [
['disableResourceType'],
['aliasResourceTypeFields'],
['disableResourceTypeFields'],
['renameResourceType'],
],
];
}
/**
* Անջատում է node/page ռեսուրսի տիպը։
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Build event-ը։
*/
public function disableResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--page') {
$event->disableResourceType();
}
}
/**
* body դաշտի անունը փոխում է content-ի։
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Build event-ը։
*/
public function aliasResourceTypeFields(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
foreach ($event->getFields() as $field) {
if ($field->getInternalName() === 'body') {
$event->setPublicFieldName($field, 'content');
}
}
}
}
/**
* Անջատում է sticky դաշտը node--article-ի համար։
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Build event-ը։
*/
public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
foreach ($event->getFields() as $field) {
if ($field->getInternalName() === 'sticky') {
$event->disableField($field);
}
}
}
}
/**
* Վերանվանում է node--article-ը article-ի՝ JSON:API-ում այն ներկայացնելով որպես /jsonapi/article
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Build event-ը։
*/
public function renameResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
$event->setResourceTypeName('article');
}
}
}
JSON:API Extras
Այս ֆունկցիոնալության մի մասը ապահովված է նաև JSON:API Extras մոդուլում։ Այս մոդուլը փորձում է օգտվել հիմնական ֆունկցիոնալությունից, որտեղ հնարավոր է, բայց տրամադրում է նաև ինտերֆեյս և որոշ լրացուցիչ հնարավորություններ, ինչպիսիք են՝
- API-ի հիմնական basepath-ը փոփոխելը։
- Դաշտերին enhancer-ներ ավելացնելը։
- Ռեսուրսները լռելյայն անջատելը։
Մոդուլը միացնելուց հետո կարող եք այցելել /admin/config/services/jsonapi՝ տեսնելու բոլոր կոնֆիգուրացիաներն ու բովանդակությունը, որ բացված է JSON:API-ով։
Հոդվածը՝ Drupal Documentation։