IndexerHandlerFactory.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogSearch\Model\Indexer;
  7. use Magento\Framework\Indexer\SaveHandler\IndexerInterface;
  8. use Magento\Framework\ObjectManagerInterface;
  9. use Magento\Framework\Search\EngineResolverInterface;
  10. /**
  11. * Indexer handler factory.
  12. *
  13. * @api
  14. * @since 100.0.2
  15. */
  16. class IndexerHandlerFactory
  17. {
  18. /**
  19. * Object Manager instance
  20. *
  21. * @var ObjectManagerInterface
  22. */
  23. protected $_objectManager = null;
  24. /**
  25. * Instance name to create
  26. *
  27. * @var string
  28. */
  29. protected $handlers = null;
  30. /**
  31. * @var EngineResolverInterface
  32. */
  33. private $engineResolver;
  34. /**
  35. * Factory constructor
  36. *
  37. * @param ObjectManagerInterface $objectManager
  38. * @param EngineResolverInterface $engineResolver
  39. * @param string[] $handlers
  40. */
  41. public function __construct(
  42. ObjectManagerInterface $objectManager,
  43. EngineResolverInterface $engineResolver,
  44. array $handlers = []
  45. ) {
  46. $this->_objectManager = $objectManager;
  47. $this->handlers = $handlers;
  48. $this->engineResolver = $engineResolver;
  49. }
  50. /**
  51. * Create indexer handler
  52. *
  53. * @param array $data
  54. * @return IndexerInterface
  55. */
  56. public function create(array $data = [])
  57. {
  58. $currentHandler = $this->engineResolver->getCurrentSearchEngine();
  59. if (!isset($this->handlers[$currentHandler])) {
  60. throw new \LogicException(
  61. 'There is no such indexer handler: ' . $currentHandler
  62. );
  63. }
  64. $indexer = $this->_objectManager->create($this->handlers[$currentHandler], $data);
  65. if (!$indexer instanceof IndexerInterface) {
  66. throw new \InvalidArgumentException(
  67. $currentHandler . ' indexer handler doesn\'t implement ' . IndexerInterface::class
  68. );
  69. }
  70. if ($indexer && !$indexer->isAvailable()) {
  71. throw new \LogicException(
  72. 'Indexer handler is not available: ' . $currentHandler
  73. );
  74. }
  75. return $indexer;
  76. }
  77. }