commerce_api-8.x-1.x-dev/src/Resource/Wishlist/WishlistAddResource.php

src/Resource/Wishlist/WishlistAddResource.php
<?php

namespace Drupal\commerce_api\Resource\Wishlist;

use Drupal\commerce\PurchasableEntityInterface;
use Drupal\commerce_api\EntityResourceShim;
use Drupal\commerce_api\Resource\ResourceTypeHelperTrait;
use Drupal\commerce_wishlist\WishlistItemStorageInterface;
use Drupal\commerce_wishlist\WishlistManagerInterface;
use Drupal\commerce_wishlist\WishlistProviderInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Render\RenderContext;
use Drupal\Core\Render\RendererInterface;
use Drupal\jsonapi\Entity\EntityValidationTrait;
use Drupal\jsonapi\JsonApiResource\ResourceIdentifier;
use Drupal\jsonapi\JsonApiResource\ResourceObject;
use Drupal\jsonapi\JsonApiResource\ResourceObjectData;
use Drupal\jsonapi\ResourceResponse;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;

final class WishlistAddResource extends WishlistResourceBase {

  use EntityValidationTrait;
  use ResourceTypeHelperTrait;

  /**
   * Constructs a new WishlistAddResource object.
   *
   * @param \Drupal\commerce_wishlist\WishlistManagerInterface $wishlist_manager
   *   The wishlist manager.
   * @param \Drupal\commerce_wishlist\WishlistProviderInterface $wishlist_provider
   *   The wishlist provider.
   * @param \Drupal\commerce_api\EntityResourceShim $jsonapi_controller
   *   The JSON:API controller shim.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   The config factory.
   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entityRepository
   *   The entity repository.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   The renderer.
   */
  public function __construct(WishlistManagerInterface $wishlist_manager, WishlistProviderInterface $wishlist_provider, EntityResourceShim $jsonapi_controller, protected ConfigFactoryInterface $configFactory, protected EntityRepositoryInterface $entityRepository, protected RendererInterface $renderer) {
    parent::__construct($wishlist_manager, $wishlist_provider, $jsonapi_controller);
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('commerce_wishlist.wishlist_manager'),
      $container->get('commerce_wishlist.wishlist_provider'),
      $container->get('commerce_api.jsonapi_controller_shim'),
      $container->get('config.factory'),
      $container->get('entity.repository'),
      $container->get('renderer')
    );
  }

  /**
   * Process the request.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The request.
   * @param array $_purchasable_entity_resource_types
   *   The purchasable entity resource types.
   *
   * @return \Drupal\jsonapi\ResourceResponse
   *   The response.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function process(Request $request, array $_purchasable_entity_resource_types = []): ResourceResponse {
    $resource_type = $this->getGeneralizedWishlistResourceType($_purchasable_entity_resource_types);
    /** @var \Drupal\jsonapi\JsonApiResource\ResourceIdentifier[] $resource_identifiers */
    $resource_identifiers = $this->inner->deserialize($resource_type, $request, ResourceIdentifier::class, 'wishlist_items');
    // Determine the wishlist type to use.
    $wishlist_type = $this->configFactory->get('commerce_wishlist.settings')->get('default_type') ?: 'default';

    $context = new RenderContext();
    $wishlist_items = $this->renderer->executeInRenderContext($context, function () use ($resource_identifiers, $wishlist_type) {
      $wishlist_items = [];
      $wishlist_item_storage = $this->entityTypeManager->getStorage('commerce_wishlist_item');
      assert($wishlist_item_storage instanceof WishlistItemStorageInterface);
      foreach ($resource_identifiers as $resource_identifier) {
        $meta = $resource_identifier->getMeta();
        $purchased_entity = $this->getEntityFromResourceIdentifier($resource_identifier);
        if (!$purchased_entity instanceof PurchasableEntityInterface) {
          throw new UnprocessableEntityHttpException(sprintf('The entity %s does not exist.', $resource_identifier->getId()));
        }
        $quantity = $meta['quantity'] ?? 1;
        $wishlist_item = $wishlist_item_storage->createFromPurchasableEntity($purchased_entity, ['quantity' => $quantity]);
        $wishlist = $this->wishlistProvider->getWishlist($wishlist_type) ?: $this->wishlistProvider->createWishlist($wishlist_type);
        $wishlist_item->set('wishlist_id', $wishlist);
        static::validate($wishlist_item, ['quantity', 'purchased_entity']);
        $wishlist_item = $this->wishlistManager->addEntity($wishlist, $purchased_entity, $quantity, $meta['combine'] ?? TRUE);
        // Reload the wishlist item as the cart has refreshed.
        $wishlist_item = $wishlist_item_storage->load($wishlist_item->id());
        $wishlist_items[] = ResourceObject::createFromEntity($this->resourceTypeRepository->get($wishlist_item->getEntityTypeId(), $wishlist_item->bundle()), $wishlist_item);
      }
      return $wishlist_items;
    });

    $primary_data = new ResourceObjectData($wishlist_items);
    return $this->createJsonapiResponse($primary_data, $request);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc