Blocks.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\CmsGraphQl\Model\Resolver;
  8. use Magento\CmsGraphQl\Model\Resolver\DataProvider\Block as BlockDataProvider;
  9. use Magento\Framework\Exception\NoSuchEntityException;
  10. use Magento\Framework\GraphQl\Config\Element\Field;
  11. use Magento\Framework\GraphQl\Exception\GraphQlInputException;
  12. use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
  13. use Magento\Framework\GraphQl\Query\ResolverInterface;
  14. use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
  15. /**
  16. * CMS blocks field resolver, used for GraphQL request processing
  17. */
  18. class Blocks implements ResolverInterface
  19. {
  20. /**
  21. * @var BlockDataProvider
  22. */
  23. private $blockDataProvider;
  24. /**
  25. * @param BlockDataProvider $blockDataProvider
  26. */
  27. public function __construct(
  28. BlockDataProvider $blockDataProvider
  29. ) {
  30. $this->blockDataProvider = $blockDataProvider;
  31. }
  32. /**
  33. * @inheritdoc
  34. */
  35. public function resolve(
  36. Field $field,
  37. $context,
  38. ResolveInfo $info,
  39. array $value = null,
  40. array $args = null
  41. ) {
  42. $blockIdentifiers = $this->getBlockIdentifiers($args);
  43. $blocksData = $this->getBlocksData($blockIdentifiers);
  44. $resultData = [
  45. 'items' => $blocksData,
  46. ];
  47. return $resultData;
  48. }
  49. /**
  50. * Get block identifiers
  51. *
  52. * @param array $args
  53. * @return string[]
  54. * @throws GraphQlInputException
  55. */
  56. private function getBlockIdentifiers(array $args): array
  57. {
  58. if (!isset($args['identifiers']) || !is_array($args['identifiers']) || count($args['identifiers']) === 0) {
  59. throw new GraphQlInputException(__('"identifiers" of CMS blocks should be specified'));
  60. }
  61. return $args['identifiers'];
  62. }
  63. /**
  64. * Get blocks data
  65. *
  66. * @param array $blockIdentifiers
  67. * @return array
  68. * @throws GraphQlNoSuchEntityException
  69. */
  70. private function getBlocksData(array $blockIdentifiers): array
  71. {
  72. $blocksData = [];
  73. foreach ($blockIdentifiers as $blockIdentifier) {
  74. try {
  75. $blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier);
  76. } catch (NoSuchEntityException $e) {
  77. $blocksData[$blockIdentifier] = new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
  78. }
  79. }
  80. return $blocksData;
  81. }
  82. }