MaintenanceModeEnabler.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. /**
  3. * Class MaintenanceMode * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\App\Console;
  7. use Magento\Framework\App\MaintenanceMode;
  8. use Symfony\Component\Console\Output\OutputInterface;
  9. /**
  10. * Class MaintenanceModeEnabler
  11. * @package Magento\Framework\App\Console
  12. */
  13. class MaintenanceModeEnabler
  14. {
  15. /**
  16. * @var MaintenanceMode
  17. */
  18. private $maintenanceMode;
  19. /**
  20. * @var bool
  21. */
  22. private $skipDisableMaintenanceMode;
  23. /**
  24. * @param MaintenanceMode $maintenanceMode
  25. */
  26. public function __construct(MaintenanceMode $maintenanceMode)
  27. {
  28. $this->maintenanceMode = $maintenanceMode;
  29. }
  30. /**
  31. * Enable maintenance mode
  32. *
  33. * @param OutputInterface $output
  34. * @return void
  35. */
  36. private function enableMaintenanceMode(OutputInterface $output)
  37. {
  38. if ($this->maintenanceMode->isOn()) {
  39. $this->skipDisableMaintenanceMode = true;
  40. $output->writeln('<info>Maintenance mode already enabled</info>');
  41. return;
  42. }
  43. $this->maintenanceMode->set(true);
  44. $this->skipDisableMaintenanceMode = false;
  45. $output->writeln('<info>Enabling maintenance mode</info>');
  46. }
  47. /**
  48. * Disable maintenance mode
  49. *
  50. * @param OutputInterface $output
  51. * @return void
  52. */
  53. private function disableMaintenanceMode(OutputInterface $output)
  54. {
  55. if ($this->skipDisableMaintenanceMode) {
  56. $output->writeln('<info>Skipped disabling maintenance mode</info>');
  57. return;
  58. }
  59. $this->maintenanceMode->set(false);
  60. $output->writeln('<info>Disabling maintenance mode</info>');
  61. }
  62. /**
  63. * Run task in maintenance mode
  64. *
  65. * @param callable $task
  66. * @param OutputInterface $output
  67. * @param bool $holdMaintenanceOnFailure
  68. * @return mixed
  69. * @throws \Throwable if error occurred
  70. */
  71. public function executeInMaintenanceMode(callable $task, OutputInterface $output, bool $holdMaintenanceOnFailure)
  72. {
  73. $this->enableMaintenanceMode($output);
  74. try {
  75. $result = call_user_func($task);
  76. } catch (\Throwable $e) {
  77. if (!$holdMaintenanceOnFailure) {
  78. $this->disableMaintenanceMode($output);
  79. }
  80. throw $e;
  81. }
  82. $this->disableMaintenanceMode($output);
  83. return $result;
  84. }
  85. }