Recurring.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Indexer\Setup;
  7. use Magento\Framework\Encryption\Encryptor;
  8. use Magento\Framework\Encryption\EncryptorInterface;
  9. use Magento\Framework\Indexer\StateInterface;
  10. use Magento\Framework\Json\EncoderInterface;
  11. use Magento\Framework\Setup\InstallSchemaInterface;
  12. use Magento\Framework\Setup\ModuleContextInterface;
  13. use Magento\Framework\Setup\SchemaSetupInterface;
  14. use Magento\Framework\Indexer\ConfigInterface;
  15. use Magento\Indexer\Model\Indexer\State;
  16. use Magento\Indexer\Model\Indexer\StateFactory;
  17. use Magento\Indexer\Model\ResourceModel\Indexer\State\CollectionFactory;
  18. /**
  19. * @codeCoverageIgnore
  20. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  21. */
  22. class Recurring implements InstallSchemaInterface
  23. {
  24. /**
  25. * Indexer collection factory
  26. *
  27. * @var CollectionFactory
  28. */
  29. private $statesFactory;
  30. /**
  31. * @var ConfigInterface
  32. */
  33. private $config;
  34. /**
  35. * @var EncryptorInterface
  36. */
  37. private $encryptor;
  38. /**
  39. * @var EncoderInterface
  40. */
  41. private $encoder;
  42. /**
  43. * @var StateFactory
  44. */
  45. private $stateFactory;
  46. /**
  47. * Init
  48. *
  49. * @param CollectionFactory $statesFactory
  50. * @param StateFactory $stateFactory
  51. * @param ConfigInterface $config
  52. * @param EncryptorInterface $encryptor
  53. * @param EncoderInterface $encoder
  54. */
  55. public function __construct(
  56. CollectionFactory $statesFactory,
  57. StateFactory $stateFactory,
  58. ConfigInterface $config,
  59. EncryptorInterface $encryptor,
  60. EncoderInterface $encoder
  61. ) {
  62. $this->statesFactory = $statesFactory;
  63. $this->stateFactory = $stateFactory;
  64. $this->config = $config;
  65. $this->encryptor = $encryptor;
  66. $this->encoder = $encoder;
  67. }
  68. /**
  69. * {@inheritdoc}
  70. */
  71. public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
  72. {
  73. /** @var State[] $stateIndexers */
  74. $stateIndexers = [];
  75. $states = $this->statesFactory->create();
  76. foreach ($states->getItems() as $state) {
  77. /** @var State $state */
  78. $stateIndexers[$state->getIndexerId()] = $state;
  79. }
  80. foreach ($this->config->getIndexers() as $indexerId => $indexerConfig) {
  81. $expectedHashConfig = $this->encryptor->hash(
  82. $this->encoder->encode($indexerConfig),
  83. Encryptor::HASH_VERSION_MD5
  84. );
  85. if (isset($stateIndexers[$indexerId])) {
  86. if ($stateIndexers[$indexerId]->getHashConfig() != $expectedHashConfig) {
  87. $stateIndexers[$indexerId]->setStatus(StateInterface::STATUS_INVALID);
  88. $stateIndexers[$indexerId]->setHashConfig($expectedHashConfig);
  89. $stateIndexers[$indexerId]->save();
  90. }
  91. } else {
  92. /** @var State $state */
  93. $state = $this->stateFactory->create();
  94. $state->loadByIndexer($indexerId);
  95. $state->setHashConfig($expectedHashConfig);
  96. $state->setStatus(StateInterface::STATUS_INVALID);
  97. $state->save();
  98. }
  99. }
  100. }
  101. }