vendor/lexik/maintenance-bundle/Command/DriverLockCommand.php line 19

Open in your IDE?
  1. <?php
  2. namespace Lexik\Bundle\MaintenanceBundle\Command;
  3. use Lexik\Bundle\MaintenanceBundle\Drivers\AbstractDriver;
  4. use Lexik\Bundle\MaintenanceBundle\Drivers\DriverTtlInterface;
  5. use Symfony\Component\Console\Input\InputArgument;
  6. use Symfony\Component\Console\Input\InputInterface;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  9. /**
  10.  * Create a lock action
  11.  *
  12.  * @package LexikMaintenanceBundle
  13.  * @author  Gilles Gauthier <g.gauthier@lexik.fr>
  14.  */
  15. class DriverLockCommand extends ContainerAwareCommand
  16. {
  17.     protected $ttl;
  18.     /**
  19.      * {@inheritdoc}
  20.      */
  21.     protected function configure()
  22.     {
  23.         $this
  24.             ->setName('lexik:maintenance:lock')
  25.             ->setDescription('Lock access to the site while maintenance...')
  26.             ->addArgument('ttl'InputArgument::OPTIONAL'Overwrite time to life from your configuration, doesn\'t work with file or shm driver. Time in seconds.'null)
  27.             ->setHelp(<<<EOT
  28.     You can optionally set a time to life of the maintenance
  29.    <info>%command.full_name% 3600</info>
  30.     You can execute the lock without a warning message which you need to interact with:
  31.     <info>%command.full_name% --no-interaction</info>
  32.     Or
  33.     <info>%command.full_name% 3600 -n</info>
  34. EOT
  35.             );
  36.     }
  37.     /**
  38.      * {@inheritdoc}
  39.      */
  40.     protected function execute(InputInterface $inputOutputInterface $output)
  41.     {
  42.         $driver $this->getDriver();
  43.         if ($input->isInteractive()) {
  44.             if (!$this->askConfirmation('WARNING! Are you sure you wish to continue? (y/n)'$input$output)) {
  45.                 $output->writeln('<error>Maintenance cancelled!</error>');
  46.                 return;
  47.             }
  48.         } elseif (null !== $input->getArgument('ttl')) {
  49.             $this->ttl $input->getArgument('ttl');
  50.         } elseif ($driver instanceof DriverTtlInterface) {
  51.             $this->ttl $driver->getTtl();
  52.         }
  53.         // set ttl from command line if given and driver supports it
  54.         if ($driver instanceof DriverTtlInterface) {
  55.             $driver->setTtl($this->ttl);
  56.         }
  57.         $output->writeln('<info>'.$driver->getMessageLock($driver->lock()).'</info>');
  58.     }
  59.     /**
  60.      * {@inheritdoc}
  61.      */
  62.     protected function interact(InputInterface $inputOutputInterface $output)
  63.     {
  64.         $driver $this->getDriver();
  65.         $default $driver->getOptions();
  66.         $formatter $this->getHelperSet()->get('formatter');
  67.         if (null !== $input->getArgument('ttl') && !is_numeric($input->getArgument('ttl'))) {
  68.             throw new \InvalidArgumentException('Time must be an integer');
  69.         }
  70.         $output->writeln(array(
  71.             '',
  72.             $formatter->formatBlock('You are about to launch maintenance''bg=red;fg=white'true),
  73.             '',
  74.         ));
  75.         $ttl null;
  76.         if ($driver instanceof DriverTtlInterface) {
  77.             if (null === $input->getArgument('ttl')) {
  78.                 $output->writeln(array(
  79.                     '',
  80.                     'Do you want to redefine maintenance life time ?',
  81.                     'If yes enter the number of seconds. Press enter to continue',
  82.                     '',
  83.                 ));
  84.                 $ttl $this->askAndValidate(
  85.                     $input,
  86.                     $output,
  87.                     sprintf('<info>%s</info> [<comment>Default value in your configuration: %s</comment>]%s ''Set time'$driver->hasTtl() ? $driver->getTtl() : 'unlimited'':'),
  88.                     function($value) use ($default) {
  89.                         if (!is_numeric($value) && null === $default) {
  90.                             return null;
  91.                         } elseif (!is_numeric($value)) {
  92.                             throw new \InvalidArgumentException('Time must be an integer');
  93.                         }
  94.                         return $value;
  95.                     },
  96.                     1,
  97.                     isset($default['ttl']) ? $default['ttl'] : 0
  98.                 );
  99.             }
  100.             $ttl = (int) $ttl;
  101.             $this->ttl $ttl $ttl $input->getArgument('ttl');
  102.         } else {
  103.             $output->writeln(array(
  104.                 '',
  105.                 sprintf('<fg=red>Ttl doesn\'t work with %s driver</>'get_class($driver)),
  106.                 '',
  107.             ));
  108.         }
  109.     }
  110.     /**
  111.      * Get driver
  112.      *
  113.      * @return AbstractDriver
  114.      */
  115.     private function getDriver()
  116.     {
  117.         return $this->getContainer()->get('lexik_maintenance.driver.factory')->getDriver();
  118.     }
  119.     /**
  120.      * This method ensure that we stay compatible with symfony console 2.3 by using the deprecated dialog helper
  121.      * but use the ConfirmationQuestion when available.
  122.      *
  123.      * @param $question
  124.      * @param InputInterface $input
  125.      * @param OutputInterface $output
  126.      * @return mixed
  127.      */
  128.     protected function askConfirmation($questionInputInterface $inputOutputInterface $output) {
  129.         if (!$this->getHelperSet()->has('question')) {
  130.             return $this->getHelper('dialog')
  131.                 ->askConfirmation($output'<question>' $question '</question>''y');
  132.         }
  133.         return $this->getHelper('question')
  134.             ->ask($input$output, new \Symfony\Component\Console\Question\ConfirmationQuestion($question));
  135.     }
  136.     /**
  137.      * This method ensure that we stay compatible with symfony console 2.3 by using the deprecated dialog helper
  138.      * but use the ConfirmationQuestion when available.
  139.      *
  140.      * @param InputInterface $input
  141.      * @param OutputInterface $output
  142.      * @param $question
  143.      * @param $validator
  144.      * @param int $attempts
  145.      * @param null $default
  146.      * @return mixed
  147.      */
  148.     protected function askAndValidate(InputInterface $inputOutputInterface $output$question$validator$attempts 1$default null) {
  149.         if (!$this->getHelperSet()->has('question')) {
  150.             return $this->getHelper('dialog')
  151.                 ->askAndValidate($output$question$validator$attempts$default);
  152.         }
  153.         $question = new \Symfony\Component\Console\Question\Question($question$default);
  154.         $question->setValidator($validator);
  155.         $question->setMaxAttempts($attempts);
  156.         return $this->getHelper('question')
  157.             ->ask($input$output$question);
  158.     }
  159. }