commerce_api-8.x-1.x-dev/src/EventSubscriber/ResourceTypeBuildSubscriber.php
src/EventSubscriber/ResourceTypeBuildSubscriber.php
<?php
declare(strict_types=1);
namespace Drupal\commerce_api\EventSubscriber;
use Drupal\commerce_api\Events\CrossBundlesGetFieldsEvent;
use Drupal\commerce_api\Events\JsonapiEvents;
use Drupal\commerce_api\Events\RenamableResourceTypeBuildEvent;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvents;
use ICanBoogie\Inflector;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Modifies the Commerce resource types to be less Drupaly.
*/
final class ResourceTypeBuildSubscriber implements EventSubscriberInterface {
/**
* The inflector.
*
* @var \ICanBoogie\Inflector
*/
private Inflector $inflector;
/**
* Constructs a new ResourceTypeBuildSubscriber object.
*/
public function __construct() {
$this->inflector = Inflector::get();
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
ResourceTypeBuildEvents::BUILD => 'onResourceTypeBuild',
JsonapiEvents::CROSS_BUNDLES_GET_FIELDS => 'onCrossBundlesFields',
];
}
/**
* Fix broken `type` field renames in Cross Bundles module.
*
* @param \Drupal\commerce_api\Events\CrossBundlesGetFieldsEvent $event
* The event.
*/
public function onCrossBundlesFields(CrossBundlesGetFieldsEvent $event) {
$entity_type_id = $event->getEntityType()->id();
if (str_starts_with($entity_type_id, 'commerce_')) {
$fields = $event->getFields();
foreach ($fields as $field_name => $field) {
if ($field->getPublicName() === $entity_type_id . '_type') {
$fields[$field_name] = $field->withPublicName(str_replace('commerce_', '', $field->getPublicName()));
}
}
$event->setFields($fields);
}
}
/**
* Customizes commerce resource types.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* The event.
*/
public function onResourceTypeBuild(ResourceTypeBuildEvent $event): void {
// Prevent crashes during container rebuilds before decoration is set.
if (!$event instanceof RenamableResourceTypeBuildEvent) {
return;
}
if (!str_starts_with($event->getResourceTypeName(), 'commerce_')) {
return;
}
// Remove commerce_ prefix and pluralize.
[$entity_type_id, $bundle] = explode('--', $event->getResourceTypeName());
$resource_type_name_base = str_replace('commerce_', '', $entity_type_id);
if ($entity_type_id !== $bundle) {
$resource_type_bundle = str_replace('commerce_', '', $bundle);
$resource_type_name = "$resource_type_name_base--$resource_type_bundle";
$resource_custom_path = $this->inflector->pluralize($resource_type_name_base) . '/' . $resource_type_bundle;
}
else {
$resource_type_name = $resource_type_name_base;
$resource_custom_path = $this->inflector->pluralize($resource_type_name_base);
}
$event->setResourceTypeName(str_replace('_', '-', $resource_type_name));
$event->setCustomPath('/' . str_replace('_', '-', $resource_custom_path));
foreach ($event->getFields() as $field) {
// Disable the internal Drupal identifiers.
if (str_starts_with($field->getPublicName(), 'drupal_internal__')) {
$event->disableField($field);
}
elseif ($field->getPublicName() === $entity_type_id . '_type') {
$event->setPublicFieldName($field, str_replace('commerce_', '', $field->getPublicName()));
}
elseif ($entity_type_id === 'commerce_order') {
if ($field->getInternalName() === 'payment_gateway') {
$event->disableField($field);
}
elseif ($field->getInternalName() === 'billing_profile') {
$event->disableField($field);
}
elseif ($field->getInternalName() === 'mail') {
$event->setPublicFieldName($field, 'email');
}
}
elseif ($entity_type_id === 'commerce_shipment') {
if ($field->getInternalName() === 'shipping_profile') {
$event->disableField($field);
}
}
}
}
}
