Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GenerateFixturesCommand.php
Go to the documentation of this file.
1 <?php
8 
12 use Symfony\Component\Console\Command\Command;
13 use Symfony\Component\Console\Input\InputArgument;
14 use Symfony\Component\Console\Input\InputInterface;
15 use Symfony\Component\Console\Input\InputOption;
16 use Symfony\Component\Console\Output\OutputInterface;
17 
22 class GenerateFixturesCommand extends Command
23 {
27  const PROFILE_ARGUMENT = 'profile';
28 
29  const SKIP_REINDEX_OPTION = 'skip-reindex';
30 
34  private $fixtureModel;
35 
39  public function __construct(FixtureModel $fixtureModel)
40  {
41  $this->fixtureModel = $fixtureModel;
42  parent::__construct();
43  }
44 
48  protected function configure()
49  {
50  $this->setName('setup:performance:generate-fixtures')
51  ->setDescription('Generates fixtures')
52  ->setDefinition([
53  new InputArgument(
54  self::PROFILE_ARGUMENT,
55  InputArgument::REQUIRED,
56  'Path to profile configuration file'
57  ),
58  new InputOption(
59  self::SKIP_REINDEX_OPTION,
60  's',
61  InputOption::VALUE_NONE,
62  'Skip reindex'
63  )
64  ]);
65  parent::configure();
66  }
67 
71  protected function execute(InputInterface $input, OutputInterface $output)
72  {
73  try {
74  $totalStartTime = microtime(true);
75 
76  $fixtureModel = $this->fixtureModel;
77  $fixtureModel->loadConfig($input->getArgument(self::PROFILE_ARGUMENT));
78  $fixtureModel->initObjectManager();
79  $fixtureModel->loadFixtures();
80 
81  $output->writeln('<info>Generating profile with following params:</info>');
82 
83  foreach ($fixtureModel->getFixtures() as $fixture) {
84  $fixture->printInfo($output);
85  }
86 
88  $configFixture = $fixtureModel
89  ->getFixtureByName(\Magento\Setup\Fixtures\ConfigsApplyFixture::class);
90  $configFixture && $this->executeFixture($configFixture, $output);
91 
93  $config = $fixtureModel->getObjectManager()->get(\Magento\Indexer\Model\Config::class);
94  $indexerListIds = $config->getIndexers();
96  $indexerRegistry = $fixtureModel->getObjectManager()
97  ->create(\Magento\Framework\Indexer\IndexerRegistry::class);
98 
99  $indexersState = [];
100  foreach ($indexerListIds as $indexerId) {
101  $indexer = $indexerRegistry->get($indexerId['indexer_id']);
102  $indexersState[$indexerId['indexer_id']] = $indexer->isScheduled();
103  $indexer->setScheduled(true);
104  }
105 
106  foreach ($fixtureModel->getFixtures() as $fixture) {
107  $this->executeFixture($fixture, $output);
108  }
109 
110  $this->clearChangelog();
111 
112  foreach ($indexerListIds as $indexerId) {
114  $indexer = $indexerRegistry->get($indexerId['indexer_id']);
115  $indexer->setScheduled($indexersState[$indexerId['indexer_id']]);
116  }
117 
119  $indexerFixture = $fixtureModel
120  ->getFixtureByName(\Magento\Setup\Fixtures\IndexersStatesApplyFixture::class);
121  $indexerFixture && $this->executeFixture($indexerFixture, $output);
122 
123  if (!$input->getOption(self::SKIP_REINDEX_OPTION)) {
124  $fixtureModel->reindex($output);
125  }
126 
127  $totalEndTime = microtime(true);
128  $totalResultTime = $totalEndTime - $totalStartTime;
129 
130  $output->writeln('<info>Total execution time: ' . gmdate('H:i:s', $totalResultTime) . '</info>');
131  } catch (\Exception $e) {
132  $output->writeln('<error>' . $e->getMessage() . '</error>');
133  // we must have an exit code higher than zero to indicate something was wrong
134  return \Magento\Framework\Console\Cli::RETURN_FAILURE;
135  }
136  return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
137  }
138 
144  private function clearChangelog()
145  {
146  $viewConfig = $this->fixtureModel->getObjectManager()->create(CollectionInterface::class);
147 
148  /* @var ResourceConnection $resource */
149  $resource = $this->fixtureModel->getObjectManager()->get(ResourceConnection::class);
150 
151  foreach ($viewConfig as $view) {
152  /* @var \Magento\Framework\Mview\ViewInterface $view */
153  $changeLogTableName = $resource->getTableName($view->getChangelog()->getName());
154  if ($resource->getConnection()->isTableExists($changeLogTableName)) {
155  $resource->getConnection()->truncateTable($changeLogTableName);
156  }
157  }
158  }
159 
164  private function executeFixture(\Magento\Setup\Fixtures\Fixture $fixture, OutputInterface $output)
165  {
166  $output->write('<info>' . $fixture->getActionTitle() . '... </info>');
167  $startTime = microtime(true);
168  $fixture->execute($output);
169  $endTime = microtime(true);
170  $resultTime = $endTime - $startTime;
171  $output->writeln('<info> done in ' . gmdate('H:i:s', $resultTime) . '</info>');
172  }
173 }
$config
Definition: fraud_order.php:17
$resource
Definition: bulk.php:12