Pressroom template verwijderd, website naar root van repo
This commit is contained in:
247
vendor/laravel/framework/src/Illuminate/Console/Application.php
vendored
Executable file
247
vendor/laravel/framework/src/Illuminate/Console/Application.php
vendored
Executable file
@@ -0,0 +1,247 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Symfony\Component\Process\ProcessUtils;
|
||||
use Illuminate\Contracts\Container\Container;
|
||||
use Symfony\Component\Console\Input\ArrayInput;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Process\PhpExecutableFinder;
|
||||
use Symfony\Component\Console\Output\BufferedOutput;
|
||||
use Symfony\Component\Console\Application as SymfonyApplication;
|
||||
use Symfony\Component\Console\Command\Command as SymfonyCommand;
|
||||
use Illuminate\Contracts\Console\Application as ApplicationContract;
|
||||
|
||||
class Application extends SymfonyApplication implements ApplicationContract
|
||||
{
|
||||
/**
|
||||
* The Laravel application instance.
|
||||
*
|
||||
* @var \Illuminate\Contracts\Container\Container
|
||||
*/
|
||||
protected $laravel;
|
||||
|
||||
/**
|
||||
* The output from the previous command.
|
||||
*
|
||||
* @var \Symfony\Component\Console\Output\BufferedOutput
|
||||
*/
|
||||
protected $lastOutput;
|
||||
|
||||
/**
|
||||
* The console application bootstrappers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $bootstrappers = [];
|
||||
|
||||
/**
|
||||
* Create a new Artisan console application.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $laravel
|
||||
* @param \Illuminate\Contracts\Events\Dispatcher $events
|
||||
* @param string $version
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Container $laravel, Dispatcher $events, $version)
|
||||
{
|
||||
parent::__construct('Laravel Framework', $version);
|
||||
|
||||
$this->laravel = $laravel;
|
||||
$this->setAutoExit(false);
|
||||
$this->setCatchExceptions(false);
|
||||
|
||||
$events->dispatch(new Events\ArtisanStarting($this));
|
||||
|
||||
$this->bootstrap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the proper PHP executable.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function phpBinary()
|
||||
{
|
||||
return ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the proper Artisan executable.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function artisanBinary()
|
||||
{
|
||||
return defined('ARTISAN_BINARY') ? ProcessUtils::escapeArgument(ARTISAN_BINARY) : 'artisan';
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the given command as a fully-qualified executable command.
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
public static function formatCommandString($string)
|
||||
{
|
||||
return sprintf('%s %s %s', static::phpBinary(), static::artisanBinary(), $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a console "starting" bootstrapper.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return void
|
||||
*/
|
||||
public static function starting(Closure $callback)
|
||||
{
|
||||
static::$bootstrappers[] = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap the console application.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function bootstrap()
|
||||
{
|
||||
foreach (static::$bootstrappers as $bootstrapper) {
|
||||
$bootstrapper($this);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear the console application bootstrappers.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function forgetBootstrappers()
|
||||
{
|
||||
static::$bootstrappers = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Run an Artisan console command by name.
|
||||
*
|
||||
* @param string $command
|
||||
* @param array $parameters
|
||||
* @param \Symfony\Component\Console\Output\OutputInterface $outputBuffer
|
||||
* @return int
|
||||
*/
|
||||
public function call($command, array $parameters = [], $outputBuffer = null)
|
||||
{
|
||||
$parameters = collect($parameters)->prepend($command);
|
||||
|
||||
$this->lastOutput = $outputBuffer ?: new BufferedOutput;
|
||||
|
||||
$this->setCatchExceptions(false);
|
||||
|
||||
$result = $this->run(new ArrayInput($parameters->toArray()), $this->lastOutput);
|
||||
|
||||
$this->setCatchExceptions(true);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the output for the last run command.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function output()
|
||||
{
|
||||
return $this->lastOutput ? $this->lastOutput->fetch() : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a command to the console.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Command\Command $command
|
||||
* @return \Symfony\Component\Console\Command\Command
|
||||
*/
|
||||
public function add(SymfonyCommand $command)
|
||||
{
|
||||
if ($command instanceof Command) {
|
||||
$command->setLaravel($this->laravel);
|
||||
}
|
||||
|
||||
return $this->addToParent($command);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the command to the parent instance.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Command\Command $command
|
||||
* @return \Symfony\Component\Console\Command\Command
|
||||
*/
|
||||
protected function addToParent(SymfonyCommand $command)
|
||||
{
|
||||
return parent::add($command);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a command, resolving through the application.
|
||||
*
|
||||
* @param string $command
|
||||
* @return \Symfony\Component\Console\Command\Command
|
||||
*/
|
||||
public function resolve($command)
|
||||
{
|
||||
return $this->add($this->laravel->make($command));
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve an array of commands through the application.
|
||||
*
|
||||
* @param array|mixed $commands
|
||||
* @return $this
|
||||
*/
|
||||
public function resolveCommands($commands)
|
||||
{
|
||||
$commands = is_array($commands) ? $commands : func_get_args();
|
||||
|
||||
foreach ($commands as $command) {
|
||||
$this->resolve($command);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default input definitions for the applications.
|
||||
*
|
||||
* This is used to add the --env option to every available command.
|
||||
*
|
||||
* @return \Symfony\Component\Console\Input\InputDefinition
|
||||
*/
|
||||
protected function getDefaultInputDefinition()
|
||||
{
|
||||
return tap(parent::getDefaultInputDefinition(), function ($definition) {
|
||||
$definition->addOption($this->getEnvironmentOption());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the global environment option for the definition.
|
||||
*
|
||||
* @return \Symfony\Component\Console\Input\InputOption
|
||||
*/
|
||||
protected function getEnvironmentOption()
|
||||
{
|
||||
$message = 'The environment the command should run under';
|
||||
|
||||
return new InputOption('--env', null, InputOption::VALUE_OPTIONAL, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Laravel application instance.
|
||||
*
|
||||
* @return \Illuminate\Contracts\Foundation\Application
|
||||
*/
|
||||
public function getLaravel()
|
||||
{
|
||||
return $this->laravel;
|
||||
}
|
||||
}
|
||||
571
vendor/laravel/framework/src/Illuminate/Console/Command.php
vendored
Executable file
571
vendor/laravel/framework/src/Illuminate/Console/Command.php
vendored
Executable file
@@ -0,0 +1,571 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Illuminate\Contracts\Support\Arrayable;
|
||||
use Symfony\Component\Console\Helper\Table;
|
||||
use Symfony\Component\Console\Input\ArrayInput;
|
||||
use Symfony\Component\Console\Output\NullOutput;
|
||||
use Symfony\Component\Console\Question\Question;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Question\ChoiceQuestion;
|
||||
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
||||
use Symfony\Component\Console\Command\Command as SymfonyCommand;
|
||||
|
||||
class Command extends SymfonyCommand
|
||||
{
|
||||
/**
|
||||
* The Laravel application instance.
|
||||
*
|
||||
* @var \Illuminate\Contracts\Foundation\Application
|
||||
*/
|
||||
protected $laravel;
|
||||
|
||||
/**
|
||||
* The input interface implementation.
|
||||
*
|
||||
* @var \Symfony\Component\Console\Input\InputInterface
|
||||
*/
|
||||
protected $input;
|
||||
|
||||
/**
|
||||
* The output interface implementation.
|
||||
*
|
||||
* @var \Illuminate\Console\OutputStyle
|
||||
*/
|
||||
protected $output;
|
||||
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature;
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name;
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description;
|
||||
|
||||
/**
|
||||
* Indicates whether the command should be shown in the Artisan command list.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $hidden = false;
|
||||
|
||||
/**
|
||||
* The default verbosity of output commands.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $verbosity = OutputInterface::VERBOSITY_NORMAL;
|
||||
|
||||
/**
|
||||
* The mapping between human readable verbosity levels and Symfony's OutputInterface.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $verbosityMap = [
|
||||
'v' => OutputInterface::VERBOSITY_VERBOSE,
|
||||
'vv' => OutputInterface::VERBOSITY_VERY_VERBOSE,
|
||||
'vvv' => OutputInterface::VERBOSITY_DEBUG,
|
||||
'quiet' => OutputInterface::VERBOSITY_QUIET,
|
||||
'normal' => OutputInterface::VERBOSITY_NORMAL,
|
||||
];
|
||||
|
||||
/**
|
||||
* Create a new console command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// We will go ahead and set the name, description, and parameters on console
|
||||
// commands just to make things a little easier on the developer. This is
|
||||
// so they don't have to all be manually specified in the constructors.
|
||||
if (isset($this->signature)) {
|
||||
$this->configureUsingFluentDefinition();
|
||||
} else {
|
||||
parent::__construct($this->name);
|
||||
}
|
||||
|
||||
// Once we have constructed the command, we'll set the description and other
|
||||
// related properties of the command. If a signature wasn't used to build
|
||||
// the command we'll set the arguments and the options on this command.
|
||||
$this->setDescription($this->description);
|
||||
|
||||
$this->setHidden($this->hidden);
|
||||
|
||||
if (! isset($this->signature)) {
|
||||
$this->specifyParameters();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure the console command using a fluent definition.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function configureUsingFluentDefinition()
|
||||
{
|
||||
list($name, $arguments, $options) = Parser::parse($this->signature);
|
||||
|
||||
parent::__construct($this->name = $name);
|
||||
|
||||
// After parsing the signature we will spin through the arguments and options
|
||||
// and set them on this command. These will already be changed into proper
|
||||
// instances of these "InputArgument" and "InputOption" Symfony classes.
|
||||
foreach ($arguments as $argument) {
|
||||
$this->getDefinition()->addArgument($argument);
|
||||
}
|
||||
|
||||
foreach ($options as $option) {
|
||||
$this->getDefinition()->addOption($option);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify the arguments and options on the command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function specifyParameters()
|
||||
{
|
||||
// We will loop through all of the arguments and options for the command and
|
||||
// set them all on the base command instance. This specifies what can get
|
||||
// passed into these commands as "parameters" to control the execution.
|
||||
foreach ($this->getArguments() as $arguments) {
|
||||
call_user_func_array([$this, 'addArgument'], $arguments);
|
||||
}
|
||||
|
||||
foreach ($this->getOptions() as $options) {
|
||||
call_user_func_array([$this, 'addOption'], $options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the console command.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Input\InputInterface $input
|
||||
* @param \Symfony\Component\Console\Output\OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
public function run(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
return parent::run(
|
||||
$this->input = $input, $this->output = new OutputStyle($input, $output)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Input\InputInterface $input
|
||||
* @param \Symfony\Component\Console\Output\OutputInterface $output
|
||||
* @return mixed
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$method = method_exists($this, 'handle') ? 'handle' : 'fire';
|
||||
|
||||
return $this->laravel->call([$this, $method]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call another console command.
|
||||
*
|
||||
* @param string $command
|
||||
* @param array $arguments
|
||||
* @return int
|
||||
*/
|
||||
public function call($command, array $arguments = [])
|
||||
{
|
||||
$arguments['command'] = $command;
|
||||
|
||||
return $this->getApplication()->find($command)->run(
|
||||
new ArrayInput($arguments), $this->output
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call another console command silently.
|
||||
*
|
||||
* @param string $command
|
||||
* @param array $arguments
|
||||
* @return int
|
||||
*/
|
||||
public function callSilent($command, array $arguments = [])
|
||||
{
|
||||
$arguments['command'] = $command;
|
||||
|
||||
return $this->getApplication()->find($command)->run(
|
||||
new ArrayInput($arguments), new NullOutput
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given argument is present.
|
||||
*
|
||||
* @param string|int $name
|
||||
* @return bool
|
||||
*/
|
||||
public function hasArgument($name)
|
||||
{
|
||||
return $this->input->hasArgument($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of a command argument.
|
||||
*
|
||||
* @param string $key
|
||||
* @return string|array
|
||||
*/
|
||||
public function argument($key = null)
|
||||
{
|
||||
if (is_null($key)) {
|
||||
return $this->input->getArguments();
|
||||
}
|
||||
|
||||
return $this->input->getArgument($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the arguments passed to the command.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function arguments()
|
||||
{
|
||||
return $this->argument();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given option is present.
|
||||
*
|
||||
* @param string $name
|
||||
* @return bool
|
||||
*/
|
||||
public function hasOption($name)
|
||||
{
|
||||
return $this->input->hasOption($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of a command option.
|
||||
*
|
||||
* @param string $key
|
||||
* @return string|array
|
||||
*/
|
||||
public function option($key = null)
|
||||
{
|
||||
if (is_null($key)) {
|
||||
return $this->input->getOptions();
|
||||
}
|
||||
|
||||
return $this->input->getOption($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the options passed to the command.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function options()
|
||||
{
|
||||
return $this->option();
|
||||
}
|
||||
|
||||
/**
|
||||
* Confirm a question with the user.
|
||||
*
|
||||
* @param string $question
|
||||
* @param bool $default
|
||||
* @return bool
|
||||
*/
|
||||
public function confirm($question, $default = false)
|
||||
{
|
||||
return $this->output->confirm($question, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompt the user for input.
|
||||
*
|
||||
* @param string $question
|
||||
* @param string $default
|
||||
* @return string
|
||||
*/
|
||||
public function ask($question, $default = null)
|
||||
{
|
||||
return $this->output->ask($question, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompt the user for input with auto completion.
|
||||
*
|
||||
* @param string $question
|
||||
* @param array $choices
|
||||
* @param string $default
|
||||
* @return string
|
||||
*/
|
||||
public function anticipate($question, array $choices, $default = null)
|
||||
{
|
||||
return $this->askWithCompletion($question, $choices, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompt the user for input with auto completion.
|
||||
*
|
||||
* @param string $question
|
||||
* @param array $choices
|
||||
* @param string $default
|
||||
* @return string
|
||||
*/
|
||||
public function askWithCompletion($question, array $choices, $default = null)
|
||||
{
|
||||
$question = new Question($question, $default);
|
||||
|
||||
$question->setAutocompleterValues($choices);
|
||||
|
||||
return $this->output->askQuestion($question);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompt the user for input but hide the answer from the console.
|
||||
*
|
||||
* @param string $question
|
||||
* @param bool $fallback
|
||||
* @return string
|
||||
*/
|
||||
public function secret($question, $fallback = true)
|
||||
{
|
||||
$question = new Question($question);
|
||||
|
||||
$question->setHidden(true)->setHiddenFallback($fallback);
|
||||
|
||||
return $this->output->askQuestion($question);
|
||||
}
|
||||
|
||||
/**
|
||||
* Give the user a single choice from an array of answers.
|
||||
*
|
||||
* @param string $question
|
||||
* @param array $choices
|
||||
* @param string $default
|
||||
* @param mixed $attempts
|
||||
* @param bool $multiple
|
||||
* @return string
|
||||
*/
|
||||
public function choice($question, array $choices, $default = null, $attempts = null, $multiple = null)
|
||||
{
|
||||
$question = new ChoiceQuestion($question, $choices, $default);
|
||||
|
||||
$question->setMaxAttempts($attempts)->setMultiselect($multiple);
|
||||
|
||||
return $this->output->askQuestion($question);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format input to textual table.
|
||||
*
|
||||
* @param array $headers
|
||||
* @param \Illuminate\Contracts\Support\Arrayable|array $rows
|
||||
* @param string $style
|
||||
* @return void
|
||||
*/
|
||||
public function table(array $headers, $rows, $style = 'default')
|
||||
{
|
||||
$table = new Table($this->output);
|
||||
|
||||
if ($rows instanceof Arrayable) {
|
||||
$rows = $rows->toArray();
|
||||
}
|
||||
|
||||
$table->setHeaders($headers)->setRows($rows)->setStyle($style)->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as information output.
|
||||
*
|
||||
* @param string $string
|
||||
* @param null|int|string $verbosity
|
||||
* @return void
|
||||
*/
|
||||
public function info($string, $verbosity = null)
|
||||
{
|
||||
$this->line($string, 'info', $verbosity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as standard output.
|
||||
*
|
||||
* @param string $string
|
||||
* @param string $style
|
||||
* @param null|int|string $verbosity
|
||||
* @return void
|
||||
*/
|
||||
public function line($string, $style = null, $verbosity = null)
|
||||
{
|
||||
$styled = $style ? "<$style>$string</$style>" : $string;
|
||||
|
||||
$this->output->writeln($styled, $this->parseVerbosity($verbosity));
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as comment output.
|
||||
*
|
||||
* @param string $string
|
||||
* @param null|int|string $verbosity
|
||||
* @return void
|
||||
*/
|
||||
public function comment($string, $verbosity = null)
|
||||
{
|
||||
$this->line($string, 'comment', $verbosity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as question output.
|
||||
*
|
||||
* @param string $string
|
||||
* @param null|int|string $verbosity
|
||||
* @return void
|
||||
*/
|
||||
public function question($string, $verbosity = null)
|
||||
{
|
||||
$this->line($string, 'question', $verbosity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as error output.
|
||||
*
|
||||
* @param string $string
|
||||
* @param null|int|string $verbosity
|
||||
* @return void
|
||||
*/
|
||||
public function error($string, $verbosity = null)
|
||||
{
|
||||
$this->line($string, 'error', $verbosity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string as warning output.
|
||||
*
|
||||
* @param string $string
|
||||
* @param null|int|string $verbosity
|
||||
* @return void
|
||||
*/
|
||||
public function warn($string, $verbosity = null)
|
||||
{
|
||||
if (! $this->output->getFormatter()->hasStyle('warning')) {
|
||||
$style = new OutputFormatterStyle('yellow');
|
||||
|
||||
$this->output->getFormatter()->setStyle('warning', $style);
|
||||
}
|
||||
|
||||
$this->line($string, 'warning', $verbosity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a string in an alert box.
|
||||
*
|
||||
* @param string $string
|
||||
* @return void
|
||||
*/
|
||||
public function alert($string)
|
||||
{
|
||||
$this->comment(str_repeat('*', strlen($string) + 12));
|
||||
$this->comment('* '.$string.' *');
|
||||
$this->comment(str_repeat('*', strlen($string) + 12));
|
||||
|
||||
$this->output->writeln('');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the verbosity level.
|
||||
*
|
||||
* @param string|int $level
|
||||
* @return void
|
||||
*/
|
||||
protected function setVerbosity($level)
|
||||
{
|
||||
$this->verbosity = $this->parseVerbosity($level);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the verbosity level in terms of Symfony's OutputInterface level.
|
||||
*
|
||||
* @param string|int $level
|
||||
* @return int
|
||||
*/
|
||||
protected function parseVerbosity($level = null)
|
||||
{
|
||||
if (isset($this->verbosityMap[$level])) {
|
||||
$level = $this->verbosityMap[$level];
|
||||
} elseif (! is_int($level)) {
|
||||
$level = $this->verbosity;
|
||||
}
|
||||
|
||||
return $level;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the output implementation.
|
||||
*
|
||||
* @return \Symfony\Component\Console\Output\OutputInterface
|
||||
*/
|
||||
public function getOutput()
|
||||
{
|
||||
return $this->output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Laravel application instance.
|
||||
*
|
||||
* @return \Illuminate\Contracts\Foundation\Application
|
||||
*/
|
||||
public function getLaravel()
|
||||
{
|
||||
return $this->laravel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the Laravel application instance.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $laravel
|
||||
* @return void
|
||||
*/
|
||||
public function setLaravel($laravel)
|
||||
{
|
||||
$this->laravel = $laravel;
|
||||
}
|
||||
}
|
||||
54
vendor/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php
vendored
Normal file
54
vendor/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Closure;
|
||||
|
||||
trait ConfirmableTrait
|
||||
{
|
||||
/**
|
||||
* Confirm before proceeding with the action.
|
||||
*
|
||||
* This method only asks for confirmation in production.
|
||||
*
|
||||
* @param string $warning
|
||||
* @param \Closure|bool|null $callback
|
||||
* @return bool
|
||||
*/
|
||||
public function confirmToProceed($warning = 'Application In Production!', $callback = null)
|
||||
{
|
||||
$callback = is_null($callback) ? $this->getDefaultConfirmCallback() : $callback;
|
||||
|
||||
$shouldConfirm = $callback instanceof Closure ? call_user_func($callback) : $callback;
|
||||
|
||||
if ($shouldConfirm) {
|
||||
if ($this->option('force')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->alert($warning);
|
||||
|
||||
$confirmed = $this->confirm('Do you really wish to run this command?');
|
||||
|
||||
if (! $confirmed) {
|
||||
$this->comment('Command Cancelled!');
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default confirmation callback.
|
||||
*
|
||||
* @return \Closure
|
||||
*/
|
||||
protected function getDefaultConfirmCallback()
|
||||
{
|
||||
return function () {
|
||||
return $this->getLaravel()->environment() == 'production';
|
||||
};
|
||||
}
|
||||
}
|
||||
18
vendor/laravel/framework/src/Illuminate/Console/DetectsApplicationNamespace.php
vendored
Normal file
18
vendor/laravel/framework/src/Illuminate/Console/DetectsApplicationNamespace.php
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Illuminate\Container\Container;
|
||||
|
||||
trait DetectsApplicationNamespace
|
||||
{
|
||||
/**
|
||||
* Get the application namespace.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getAppNamespace()
|
||||
{
|
||||
return Container::getInstance()->getNamespace();
|
||||
}
|
||||
}
|
||||
24
vendor/laravel/framework/src/Illuminate/Console/Events/ArtisanStarting.php
vendored
Normal file
24
vendor/laravel/framework/src/Illuminate/Console/Events/ArtisanStarting.php
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Events;
|
||||
|
||||
class ArtisanStarting
|
||||
{
|
||||
/**
|
||||
* The Artisan application instance.
|
||||
*
|
||||
* @var \Illuminate\Console\Application
|
||||
*/
|
||||
public $artisan;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param \Illuminate\Console\Application $artisan
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($artisan)
|
||||
{
|
||||
$this->artisan = $artisan;
|
||||
}
|
||||
}
|
||||
233
vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php
vendored
Normal file
233
vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php
vendored
Normal file
@@ -0,0 +1,233 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
abstract class GeneratorCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The filesystem instance.
|
||||
*
|
||||
* @var \Illuminate\Filesystem\Filesystem
|
||||
*/
|
||||
protected $files;
|
||||
|
||||
/**
|
||||
* The type of class being generated.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $type;
|
||||
|
||||
/**
|
||||
* Create a new controller creator command instance.
|
||||
*
|
||||
* @param \Illuminate\Filesystem\Filesystem $files
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Filesystem $files)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->files = $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the stub file for the generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function getStub();
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return bool|null
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
$name = $this->qualifyClass($this->getNameInput());
|
||||
|
||||
$path = $this->getPath($name);
|
||||
|
||||
// First we will check to see if the class already exists. If it does, we don't want
|
||||
// to create the class and overwrite the user's code. So, we will bail out so the
|
||||
// code is untouched. Otherwise, we will continue generating this class' files.
|
||||
if ($this->alreadyExists($this->getNameInput())) {
|
||||
$this->error($this->type.' already exists!');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Next, we will generate the path to the location where this class' file should get
|
||||
// written. Then, we will build the class and make the proper replacements on the
|
||||
// stub files so that it gets the correctly formatted namespace and class name.
|
||||
$this->makeDirectory($path);
|
||||
|
||||
$this->files->put($path, $this->buildClass($name));
|
||||
|
||||
$this->info($this->type.' created successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the class name and format according to the root namespace.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function qualifyClass($name)
|
||||
{
|
||||
$rootNamespace = $this->rootNamespace();
|
||||
|
||||
if (Str::startsWith($name, $rootNamespace)) {
|
||||
return $name;
|
||||
}
|
||||
|
||||
$name = str_replace('/', '\\', $name);
|
||||
|
||||
return $this->qualifyClass(
|
||||
$this->getDefaultNamespace(trim($rootNamespace, '\\')).'\\'.$name
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default namespace for the class.
|
||||
*
|
||||
* @param string $rootNamespace
|
||||
* @return string
|
||||
*/
|
||||
protected function getDefaultNamespace($rootNamespace)
|
||||
{
|
||||
return $rootNamespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the class already exists.
|
||||
*
|
||||
* @param string $rawName
|
||||
* @return bool
|
||||
*/
|
||||
protected function alreadyExists($rawName)
|
||||
{
|
||||
return $this->files->exists($this->getPath($this->qualifyClass($rawName)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the destination class path.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function getPath($name)
|
||||
{
|
||||
$name = str_replace_first($this->rootNamespace(), '', $name);
|
||||
|
||||
return $this->laravel['path'].'/'.str_replace('\\', '/', $name).'.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the directory for the class if necessary.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function makeDirectory($path)
|
||||
{
|
||||
if (! $this->files->isDirectory(dirname($path))) {
|
||||
$this->files->makeDirectory(dirname($path), 0777, true, true);
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the class with the given name.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function buildClass($name)
|
||||
{
|
||||
$stub = $this->files->get($this->getStub());
|
||||
|
||||
return $this->replaceNamespace($stub, $name)->replaceClass($stub, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the namespace for the given stub.
|
||||
*
|
||||
* @param string $stub
|
||||
* @param string $name
|
||||
* @return $this
|
||||
*/
|
||||
protected function replaceNamespace(&$stub, $name)
|
||||
{
|
||||
$stub = str_replace(
|
||||
['DummyNamespace', 'DummyRootNamespace'],
|
||||
[$this->getNamespace($name), $this->rootNamespace()],
|
||||
$stub
|
||||
);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full namespace for a given class, without the class name.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function getNamespace($name)
|
||||
{
|
||||
return trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\');
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the class name for the given stub.
|
||||
*
|
||||
* @param string $stub
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function replaceClass($stub, $name)
|
||||
{
|
||||
$class = str_replace($this->getNamespace($name).'\\', '', $name);
|
||||
|
||||
return str_replace('DummyClass', $class, $stub);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the desired class name from the input.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getNameInput()
|
||||
{
|
||||
return trim($this->argument('name'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the root namespace for the class.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function rootNamespace()
|
||||
{
|
||||
return $this->laravel->getNamespace();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return [
|
||||
['name', InputArgument::REQUIRED, 'The name of the class'],
|
||||
];
|
||||
}
|
||||
}
|
||||
71
vendor/laravel/framework/src/Illuminate/Console/OutputStyle.php
vendored
Normal file
71
vendor/laravel/framework/src/Illuminate/Console/OutputStyle.php
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class OutputStyle extends SymfonyStyle
|
||||
{
|
||||
/**
|
||||
* The output instance.
|
||||
*
|
||||
* @var \Symfony\Component\Console\Output\OutputInterface
|
||||
*/
|
||||
private $output;
|
||||
|
||||
/**
|
||||
* Create a new Console OutputStyle instance.
|
||||
*
|
||||
* @param \Symfony\Component\Console\Input\InputInterface $input
|
||||
* @param \Symfony\Component\Console\Output\OutputInterface $output
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->output = $output;
|
||||
|
||||
parent::__construct($input, $output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether verbosity is quiet (-q).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isQuiet()
|
||||
{
|
||||
return $this->output->isQuiet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether verbosity is verbose (-v).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isVerbose()
|
||||
{
|
||||
return $this->output->isVerbose();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether verbosity is very verbose (-vv).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isVeryVerbose()
|
||||
{
|
||||
return $this->output->isVeryVerbose();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether verbosity is debug (-vvv).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isDebug()
|
||||
{
|
||||
return $this->output->isDebug();
|
||||
}
|
||||
}
|
||||
142
vendor/laravel/framework/src/Illuminate/Console/Parser.php
vendored
Normal file
142
vendor/laravel/framework/src/Illuminate/Console/Parser.php
vendored
Normal file
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use InvalidArgumentException;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class Parser
|
||||
{
|
||||
/**
|
||||
* Parse the given console command definition into an array.
|
||||
*
|
||||
* @param string $expression
|
||||
* @return array
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function parse($expression)
|
||||
{
|
||||
$name = static::name($expression);
|
||||
|
||||
if (preg_match_all('/\{\s*(.*?)\s*\}/', $expression, $matches)) {
|
||||
if (count($matches[1])) {
|
||||
return array_merge([$name], static::parameters($matches[1]));
|
||||
}
|
||||
}
|
||||
|
||||
return [$name, [], []];
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the name of the command from the expression.
|
||||
*
|
||||
* @param string $expression
|
||||
* @return string
|
||||
*/
|
||||
protected static function name($expression)
|
||||
{
|
||||
if (trim($expression) === '') {
|
||||
throw new InvalidArgumentException('Console command definition is empty.');
|
||||
}
|
||||
|
||||
if (! preg_match('/[^\s]+/', $expression, $matches)) {
|
||||
throw new InvalidArgumentException('Unable to determine command name from signature.');
|
||||
}
|
||||
|
||||
return $matches[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract all of the parameters from the tokens.
|
||||
*
|
||||
* @param array $tokens
|
||||
* @return array
|
||||
*/
|
||||
protected static function parameters(array $tokens)
|
||||
{
|
||||
$arguments = [];
|
||||
|
||||
$options = [];
|
||||
|
||||
foreach ($tokens as $token) {
|
||||
if (preg_match('/-{2,}(.*)/', $token, $matches)) {
|
||||
$options[] = static::parseOption($matches[1]);
|
||||
} else {
|
||||
$arguments[] = static::parseArgument($token);
|
||||
}
|
||||
}
|
||||
|
||||
return [$arguments, $options];
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an argument expression.
|
||||
*
|
||||
* @param string $token
|
||||
* @return \Symfony\Component\Console\Input\InputArgument
|
||||
*/
|
||||
protected static function parseArgument($token)
|
||||
{
|
||||
list($token, $description) = static::extractDescription($token);
|
||||
|
||||
switch (true) {
|
||||
case Str::endsWith($token, '?*'):
|
||||
return new InputArgument(trim($token, '?*'), InputArgument::IS_ARRAY, $description);
|
||||
case Str::endsWith($token, '*'):
|
||||
return new InputArgument(trim($token, '*'), InputArgument::IS_ARRAY | InputArgument::REQUIRED, $description);
|
||||
case Str::endsWith($token, '?'):
|
||||
return new InputArgument(trim($token, '?'), InputArgument::OPTIONAL, $description);
|
||||
case preg_match('/(.+)\=(.+)/', $token, $matches):
|
||||
return new InputArgument($matches[1], InputArgument::OPTIONAL, $description, $matches[2]);
|
||||
default:
|
||||
return new InputArgument($token, InputArgument::REQUIRED, $description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an option expression.
|
||||
*
|
||||
* @param string $token
|
||||
* @return \Symfony\Component\Console\Input\InputOption
|
||||
*/
|
||||
protected static function parseOption($token)
|
||||
{
|
||||
list($token, $description) = static::extractDescription($token);
|
||||
|
||||
$matches = preg_split('/\s*\|\s*/', $token, 2);
|
||||
|
||||
if (isset($matches[1])) {
|
||||
$shortcut = $matches[0];
|
||||
$token = $matches[1];
|
||||
} else {
|
||||
$shortcut = null;
|
||||
}
|
||||
|
||||
switch (true) {
|
||||
case Str::endsWith($token, '='):
|
||||
return new InputOption(trim($token, '='), $shortcut, InputOption::VALUE_OPTIONAL, $description);
|
||||
case Str::endsWith($token, '=*'):
|
||||
return new InputOption(trim($token, '=*'), $shortcut, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, $description);
|
||||
case preg_match('/(.+)\=(.+)/', $token, $matches):
|
||||
return new InputOption($matches[1], $shortcut, InputOption::VALUE_OPTIONAL, $description, $matches[2]);
|
||||
default:
|
||||
return new InputOption($token, $shortcut, InputOption::VALUE_NONE, $description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the token into its token and description segments.
|
||||
*
|
||||
* @param string $token
|
||||
* @return array
|
||||
*/
|
||||
protected static function extractDescription($token)
|
||||
{
|
||||
$parts = preg_split('/\s+:\s+/', trim($token), 2);
|
||||
|
||||
return count($parts) === 2 ? $parts : [$token, null];
|
||||
}
|
||||
}
|
||||
61
vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheMutex.php
vendored
Normal file
61
vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheMutex.php
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Illuminate\Contracts\Cache\Repository as Cache;
|
||||
|
||||
class CacheMutex implements Mutex
|
||||
{
|
||||
/**
|
||||
* The cache repository implementation.
|
||||
*
|
||||
* @var \Illuminate\Contracts\Cache\Repository
|
||||
*/
|
||||
public $cache;
|
||||
|
||||
/**
|
||||
* Create a new overlapping strategy.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Cache\Repository $cache
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Cache $cache)
|
||||
{
|
||||
$this->cache = $cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to obtain a mutex for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return bool
|
||||
*/
|
||||
public function create(Event $event)
|
||||
{
|
||||
return $this->cache->add(
|
||||
$event->mutexName(), true, $event->expiresAt
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a mutex exists for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return bool
|
||||
*/
|
||||
public function exists(Event $event)
|
||||
{
|
||||
return $this->cache->has($event->mutexName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the mutex for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return void
|
||||
*/
|
||||
public function forget(Event $event)
|
||||
{
|
||||
$this->cache->forget($event->mutexName());
|
||||
}
|
||||
}
|
||||
136
vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php
vendored
Normal file
136
vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use LogicException;
|
||||
use InvalidArgumentException;
|
||||
use Illuminate\Contracts\Container\Container;
|
||||
|
||||
class CallbackEvent extends Event
|
||||
{
|
||||
/**
|
||||
* The callback to call.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $callback;
|
||||
|
||||
/**
|
||||
* The parameters to pass to the method.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $parameters;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Mutex $mutex
|
||||
* @param string $callback
|
||||
* @param array $parameters
|
||||
* @return void
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(Mutex $mutex, $callback, array $parameters = [])
|
||||
{
|
||||
if (! is_string($callback) && ! is_callable($callback)) {
|
||||
throw new InvalidArgumentException(
|
||||
'Invalid scheduled callback event. Must be a string or callable.'
|
||||
);
|
||||
}
|
||||
|
||||
$this->mutex = $mutex;
|
||||
$this->callback = $callback;
|
||||
$this->parameters = $parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given event.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $container
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function run(Container $container)
|
||||
{
|
||||
if ($this->description && $this->withoutOverlapping &&
|
||||
! $this->mutex->create($this)) {
|
||||
return;
|
||||
}
|
||||
|
||||
register_shutdown_function(function () {
|
||||
$this->removeMutex();
|
||||
});
|
||||
|
||||
try {
|
||||
$response = $container->call($this->callback, $this->parameters);
|
||||
} finally {
|
||||
$this->removeMutex();
|
||||
}
|
||||
|
||||
parent::callAfterCallbacks($container);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the mutex for the event.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function removeMutex()
|
||||
{
|
||||
if ($this->description) {
|
||||
$this->mutex->forget($this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not allow the event to overlap each other.
|
||||
*
|
||||
* @param int $expiresAt
|
||||
* @return $this
|
||||
*/
|
||||
public function withoutOverlapping($expiresAt = 1440)
|
||||
{
|
||||
if (! isset($this->description)) {
|
||||
throw new LogicException(
|
||||
"A scheduled event name is required to prevent overlapping. Use the 'name' method before 'withoutOverlapping'."
|
||||
);
|
||||
}
|
||||
|
||||
$this->withoutOverlapping = true;
|
||||
|
||||
$this->expiresAt = $expiresAt;
|
||||
|
||||
return $this->skip(function () {
|
||||
return $this->mutex->exists($this);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mutex name for the scheduled command.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function mutexName()
|
||||
{
|
||||
return 'framework/schedule-'.sha1($this->description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the summary of the event for display.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSummaryForDisplay()
|
||||
{
|
||||
if (is_string($this->description)) {
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
return is_string($this->callback) ? $this->callback : 'Closure';
|
||||
}
|
||||
}
|
||||
71
vendor/laravel/framework/src/Illuminate/Console/Scheduling/CommandBuilder.php
vendored
Normal file
71
vendor/laravel/framework/src/Illuminate/Console/Scheduling/CommandBuilder.php
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Illuminate\Console\Application;
|
||||
use Symfony\Component\Process\ProcessUtils;
|
||||
|
||||
class CommandBuilder
|
||||
{
|
||||
/**
|
||||
* Build the command for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return string
|
||||
*/
|
||||
public function buildCommand(Event $event)
|
||||
{
|
||||
if ($event->runInBackground) {
|
||||
return $this->buildBackgroundCommand($event);
|
||||
} else {
|
||||
return $this->buildForegroundCommand($event);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the command for running the event in the foreground.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return string
|
||||
*/
|
||||
protected function buildForegroundCommand(Event $event)
|
||||
{
|
||||
$output = ProcessUtils::escapeArgument($event->output);
|
||||
|
||||
return $this->ensureCorrectUser(
|
||||
$event, $event->command.($event->shouldAppendOutput ? ' >> ' : ' > ').$output.' 2>&1'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the command for running the event in the background.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return string
|
||||
*/
|
||||
protected function buildBackgroundCommand(Event $event)
|
||||
{
|
||||
$output = ProcessUtils::escapeArgument($event->output);
|
||||
|
||||
$redirect = $event->shouldAppendOutput ? ' >> ' : ' > ';
|
||||
|
||||
$finished = Application::formatCommandString('schedule:finish').' "'.$event->mutexName().'"';
|
||||
|
||||
return $this->ensureCorrectUser($event,
|
||||
'('.$event->command.$redirect.$output.' 2>&1 '.(windows_os() ? '&' : ';').' '.$finished.') > '
|
||||
.ProcessUtils::escapeArgument($event->getDefaultOutput()).' 2>&1 &'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalize the event's command syntax with the correct user.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @param string $command
|
||||
* @return string
|
||||
*/
|
||||
protected function ensureCorrectUser(Event $event, $command)
|
||||
{
|
||||
return $event->user && ! windows_os() ? 'sudo -u '.$event->user.' -- sh -c \''.$command.'\'' : $command;
|
||||
}
|
||||
}
|
||||
670
vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php
vendored
Normal file
670
vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php
vendored
Normal file
@@ -0,0 +1,670 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Closure;
|
||||
use Carbon\Carbon;
|
||||
use Cron\CronExpression;
|
||||
use GuzzleHttp\Client as HttpClient;
|
||||
use Illuminate\Contracts\Mail\Mailer;
|
||||
use Symfony\Component\Process\Process;
|
||||
use Illuminate\Support\Traits\Macroable;
|
||||
use Illuminate\Contracts\Container\Container;
|
||||
|
||||
class Event
|
||||
{
|
||||
use Macroable, ManagesFrequencies;
|
||||
|
||||
/**
|
||||
* The command string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $command;
|
||||
|
||||
/**
|
||||
* The cron expression representing the event's frequency.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $expression = '* * * * * *';
|
||||
|
||||
/**
|
||||
* The timezone the date should be evaluated on.
|
||||
*
|
||||
* @var \DateTimeZone|string
|
||||
*/
|
||||
public $timezone;
|
||||
|
||||
/**
|
||||
* The user the command should run as.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* The list of environments the command should run under.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $environments = [];
|
||||
|
||||
/**
|
||||
* Indicates if the command should run in maintenance mode.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $evenInMaintenanceMode = false;
|
||||
|
||||
/**
|
||||
* Indicates if the command should not overlap itself.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $withoutOverlapping = false;
|
||||
|
||||
/**
|
||||
* The amount of time the mutex should be valid.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $expiresAt = 1440;
|
||||
|
||||
/**
|
||||
* Indicates if the command should run in background.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $runInBackground = false;
|
||||
|
||||
/**
|
||||
* The array of filter callbacks.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $filters = [];
|
||||
|
||||
/**
|
||||
* The array of reject callbacks.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $rejects = [];
|
||||
|
||||
/**
|
||||
* The location that output should be sent to.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $output = '/dev/null';
|
||||
|
||||
/**
|
||||
* Indicates whether output should be appended.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $shouldAppendOutput = false;
|
||||
|
||||
/**
|
||||
* The array of callbacks to be run before the event is started.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $beforeCallbacks = [];
|
||||
|
||||
/**
|
||||
* The array of callbacks to be run after the event is finished.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $afterCallbacks = [];
|
||||
|
||||
/**
|
||||
* The human readable description of the event.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $description;
|
||||
|
||||
/**
|
||||
* The mutex implementation.
|
||||
*
|
||||
* @var \Illuminate\Console\Scheduling\Mutex
|
||||
*/
|
||||
public $mutex;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Mutex $mutex
|
||||
* @param string $command
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Mutex $mutex, $command)
|
||||
{
|
||||
$this->mutex = $mutex;
|
||||
$this->command = $command;
|
||||
$this->output = $this->getDefaultOutput();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default output depending on the OS.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDefaultOutput()
|
||||
{
|
||||
return (DIRECTORY_SEPARATOR == '\\') ? 'NUL' : '/dev/null';
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given event.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $container
|
||||
* @return void
|
||||
*/
|
||||
public function run(Container $container)
|
||||
{
|
||||
if ($this->withoutOverlapping &&
|
||||
! $this->mutex->create($this)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->runInBackground
|
||||
? $this->runCommandInBackground($container)
|
||||
: $this->runCommandInForeground($container);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mutex name for the scheduled command.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function mutexName()
|
||||
{
|
||||
return 'framework'.DIRECTORY_SEPARATOR.'schedule-'.sha1($this->expression.$this->command);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the command in the foreground.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $container
|
||||
* @return void
|
||||
*/
|
||||
protected function runCommandInForeground(Container $container)
|
||||
{
|
||||
$this->callBeforeCallbacks($container);
|
||||
|
||||
(new Process(
|
||||
$this->buildCommand(), base_path(), null, null, null
|
||||
))->run();
|
||||
|
||||
$this->callAfterCallbacks($container);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the command in the background.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $container
|
||||
* @return void
|
||||
*/
|
||||
protected function runCommandInBackground(Container $container)
|
||||
{
|
||||
$this->callBeforeCallbacks($container);
|
||||
|
||||
(new Process(
|
||||
$this->buildCommand(), base_path(), null, null, null
|
||||
))->run();
|
||||
}
|
||||
|
||||
/**
|
||||
* Call all of the "before" callbacks for the event.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $container
|
||||
* @return void
|
||||
*/
|
||||
public function callBeforeCallbacks(Container $container)
|
||||
{
|
||||
foreach ($this->beforeCallbacks as $callback) {
|
||||
$container->call($callback);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call all of the "after" callbacks for the event.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Container\Container $container
|
||||
* @return void
|
||||
*/
|
||||
public function callAfterCallbacks(Container $container)
|
||||
{
|
||||
foreach ($this->afterCallbacks as $callback) {
|
||||
$container->call($callback);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the command string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function buildCommand()
|
||||
{
|
||||
return (new CommandBuilder)->buildCommand($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given event should run based on the Cron expression.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Foundation\Application $app
|
||||
* @return bool
|
||||
*/
|
||||
public function isDue($app)
|
||||
{
|
||||
if (! $this->runsInMaintenanceMode() && $app->isDownForMaintenance()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->expressionPasses() &&
|
||||
$this->runsInEnvironment($app->environment());
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the event runs in maintenance mode.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function runsInMaintenanceMode()
|
||||
{
|
||||
return $this->evenInMaintenanceMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the Cron expression passes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function expressionPasses()
|
||||
{
|
||||
$date = Carbon::now();
|
||||
|
||||
if ($this->timezone) {
|
||||
$date->setTimezone($this->timezone);
|
||||
}
|
||||
|
||||
return CronExpression::factory($this->expression)->isDue($date->toDateTimeString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the event runs in the given environment.
|
||||
*
|
||||
* @param string $environment
|
||||
* @return bool
|
||||
*/
|
||||
public function runsInEnvironment($environment)
|
||||
{
|
||||
return empty($this->environments) || in_array($environment, $this->environments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the filters pass for the event.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Foundation\Application $app
|
||||
* @return bool
|
||||
*/
|
||||
public function filtersPass($app)
|
||||
{
|
||||
foreach ($this->filters as $callback) {
|
||||
if (! $app->call($callback)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($this->rejects as $callback) {
|
||||
if ($app->call($callback)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the output of the command to a given location.
|
||||
*
|
||||
* @param string $location
|
||||
* @param bool $append
|
||||
* @return $this
|
||||
*/
|
||||
public function sendOutputTo($location, $append = false)
|
||||
{
|
||||
$this->output = $location;
|
||||
|
||||
$this->shouldAppendOutput = $append;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append the output of the command to a given location.
|
||||
*
|
||||
* @param string $location
|
||||
* @return $this
|
||||
*/
|
||||
public function appendOutputTo($location)
|
||||
{
|
||||
return $this->sendOutputTo($location, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* E-mail the results of the scheduled operation.
|
||||
*
|
||||
* @param array|mixed $addresses
|
||||
* @param bool $onlyIfOutputExists
|
||||
* @return $this
|
||||
*
|
||||
* @throws \LogicException
|
||||
*/
|
||||
public function emailOutputTo($addresses, $onlyIfOutputExists = false)
|
||||
{
|
||||
$this->ensureOutputIsBeingCapturedForEmail();
|
||||
|
||||
$addresses = is_array($addresses) ? $addresses : [$addresses];
|
||||
|
||||
return $this->then(function (Mailer $mailer) use ($addresses, $onlyIfOutputExists) {
|
||||
$this->emailOutput($mailer, $addresses, $onlyIfOutputExists);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* E-mail the results of the scheduled operation if it produces output.
|
||||
*
|
||||
* @param array|mixed $addresses
|
||||
* @return $this
|
||||
*
|
||||
* @throws \LogicException
|
||||
*/
|
||||
public function emailWrittenOutputTo($addresses)
|
||||
{
|
||||
return $this->emailOutputTo($addresses, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that output is being captured for email.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function ensureOutputIsBeingCapturedForEmail()
|
||||
{
|
||||
if (is_null($this->output) || $this->output == $this->getDefaultOutput()) {
|
||||
$this->sendOutputTo(storage_path('logs/schedule-'.sha1($this->mutexName()).'.log'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* E-mail the output of the event to the recipients.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Mail\Mailer $mailer
|
||||
* @param array $addresses
|
||||
* @param bool $onlyIfOutputExists
|
||||
* @return void
|
||||
*/
|
||||
protected function emailOutput(Mailer $mailer, $addresses, $onlyIfOutputExists = false)
|
||||
{
|
||||
$text = file_exists($this->output) ? file_get_contents($this->output) : '';
|
||||
|
||||
if ($onlyIfOutputExists && empty($text)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$mailer->raw($text, function ($m) use ($addresses) {
|
||||
$m->to($addresses)->subject($this->getEmailSubject());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the e-mail subject line for output results.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getEmailSubject()
|
||||
{
|
||||
if ($this->description) {
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
return 'Scheduled Job Output';
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to ping a given URL before the job runs.
|
||||
*
|
||||
* @param string $url
|
||||
* @return $this
|
||||
*/
|
||||
public function pingBefore($url)
|
||||
{
|
||||
return $this->before(function () use ($url) {
|
||||
(new HttpClient)->get($url);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to ping a given URL after the job runs.
|
||||
*
|
||||
* @param string $url
|
||||
* @return $this
|
||||
*/
|
||||
public function thenPing($url)
|
||||
{
|
||||
return $this->then(function () use ($url) {
|
||||
(new HttpClient)->get($url);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* State that the command should run in background.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function runInBackground()
|
||||
{
|
||||
$this->runInBackground = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set which user the command should run as.
|
||||
*
|
||||
* @param string $user
|
||||
* @return $this
|
||||
*/
|
||||
public function user($user)
|
||||
{
|
||||
$this->user = $user;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Limit the environments the command should run in.
|
||||
*
|
||||
* @param array|mixed $environments
|
||||
* @return $this
|
||||
*/
|
||||
public function environments($environments)
|
||||
{
|
||||
$this->environments = is_array($environments) ? $environments : func_get_args();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* State that the command should run even in maintenance mode.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function evenInMaintenanceMode()
|
||||
{
|
||||
$this->evenInMaintenanceMode = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not allow the event to overlap each other.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function withoutOverlapping()
|
||||
{
|
||||
$this->withoutOverlapping = true;
|
||||
|
||||
return $this->then(function () {
|
||||
$this->mutex->forget($this);
|
||||
})->skip(function () {
|
||||
return $this->mutex->exists($this);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to further filter the schedule.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return $this
|
||||
*/
|
||||
public function when(Closure $callback)
|
||||
{
|
||||
$this->filters[] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to further filter the schedule.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return $this
|
||||
*/
|
||||
public function skip(Closure $callback)
|
||||
{
|
||||
$this->rejects[] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to be called before the operation.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return $this
|
||||
*/
|
||||
public function before(Closure $callback)
|
||||
{
|
||||
$this->beforeCallbacks[] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to be called after the operation.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return $this
|
||||
*/
|
||||
public function after(Closure $callback)
|
||||
{
|
||||
return $this->then($callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a callback to be called after the operation.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return $this
|
||||
*/
|
||||
public function then(Closure $callback)
|
||||
{
|
||||
$this->afterCallbacks[] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the human-friendly description of the event.
|
||||
*
|
||||
* @param string $description
|
||||
* @return $this
|
||||
*/
|
||||
public function name($description)
|
||||
{
|
||||
return $this->description($description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the human-friendly description of the event.
|
||||
*
|
||||
* @param string $description
|
||||
* @return $this
|
||||
*/
|
||||
public function description($description)
|
||||
{
|
||||
$this->description = $description;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the summary of the event for display.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSummaryForDisplay()
|
||||
{
|
||||
if (is_string($this->description)) {
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
return $this->buildCommand();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the next due date for an event.
|
||||
*
|
||||
* @param \DateTime|string $currentTime
|
||||
* @param int $nth
|
||||
* @param bool $allowCurrentDate
|
||||
* @return \Carbon\Carbon
|
||||
*/
|
||||
public function nextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false)
|
||||
{
|
||||
return Carbon::instance($nextDue = CronExpression::factory(
|
||||
$this->getExpression()
|
||||
)->getNextRunDate($currentTime, $nth, $allowCurrentDate));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Cron expression for the event.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getExpression()
|
||||
{
|
||||
return $this->expression;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the mutex implementation to be used.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Mutex $mutex
|
||||
* @return $this
|
||||
*/
|
||||
public function preventOverlapsUsing(Mutex $mutex)
|
||||
{
|
||||
$this->mutex = $mutex;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
401
vendor/laravel/framework/src/Illuminate/Console/Scheduling/ManagesFrequencies.php
vendored
Normal file
401
vendor/laravel/framework/src/Illuminate/Console/Scheduling/ManagesFrequencies.php
vendored
Normal file
@@ -0,0 +1,401 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Carbon\Carbon;
|
||||
|
||||
trait ManagesFrequencies
|
||||
{
|
||||
/**
|
||||
* The Cron expression representing the event's frequency.
|
||||
*
|
||||
* @param string $expression
|
||||
* @return $this
|
||||
*/
|
||||
public function cron($expression)
|
||||
{
|
||||
$this->expression = $expression;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run between start and end time.
|
||||
*
|
||||
* @param string $startTime
|
||||
* @param string $endTime
|
||||
* @return $this
|
||||
*/
|
||||
public function between($startTime, $endTime)
|
||||
{
|
||||
return $this->when($this->inTimeInterval($startTime, $endTime));
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to not run between start and end time.
|
||||
*
|
||||
* @param string $startTime
|
||||
* @param string $endTime
|
||||
* @return $this
|
||||
*/
|
||||
public function unlessBetween($startTime, $endTime)
|
||||
{
|
||||
return $this->skip($this->inTimeInterval($startTime, $endTime));
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run between start and end time.
|
||||
*
|
||||
* @param string $startTime
|
||||
* @param string $endTime
|
||||
* @return \Closure
|
||||
*/
|
||||
private function inTimeInterval($startTime, $endTime)
|
||||
{
|
||||
return function () use ($startTime, $endTime) {
|
||||
return Carbon::now($this->timezone)->between(
|
||||
Carbon::parse($startTime, $this->timezone),
|
||||
Carbon::parse($endTime, $this->timezone),
|
||||
true
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run hourly.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function hourly()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run hourly at a given offset in the hour.
|
||||
*
|
||||
* @param int $offset
|
||||
* @return $this
|
||||
*/
|
||||
public function hourlyAt($offset)
|
||||
{
|
||||
return $this->spliceIntoPosition(1, $offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run daily.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function daily()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the command at a given time.
|
||||
*
|
||||
* @param string $time
|
||||
* @return $this
|
||||
*/
|
||||
public function at($time)
|
||||
{
|
||||
return $this->dailyAt($time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run daily at a given time (10:00, 19:30, etc).
|
||||
*
|
||||
* @param string $time
|
||||
* @return $this
|
||||
*/
|
||||
public function dailyAt($time)
|
||||
{
|
||||
$segments = explode(':', $time);
|
||||
|
||||
return $this->spliceIntoPosition(2, (int) $segments[0])
|
||||
->spliceIntoPosition(1, count($segments) == 2 ? (int) $segments[1] : '0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run twice daily.
|
||||
*
|
||||
* @param int $first
|
||||
* @param int $second
|
||||
* @return $this
|
||||
*/
|
||||
public function twiceDaily($first = 1, $second = 13)
|
||||
{
|
||||
$hours = $first.','.$second;
|
||||
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, $hours);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on weekdays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function weekdays()
|
||||
{
|
||||
return $this->spliceIntoPosition(5, '1-5');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on weekends.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function weekends()
|
||||
{
|
||||
return $this->spliceIntoPosition(5, '0,6');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Mondays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function mondays()
|
||||
{
|
||||
return $this->days(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Tuesdays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function tuesdays()
|
||||
{
|
||||
return $this->days(2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Wednesdays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function wednesdays()
|
||||
{
|
||||
return $this->days(3);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Thursdays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function thursdays()
|
||||
{
|
||||
return $this->days(4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Fridays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function fridays()
|
||||
{
|
||||
return $this->days(5);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Saturdays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function saturdays()
|
||||
{
|
||||
return $this->days(6);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run only on Sundays.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function sundays()
|
||||
{
|
||||
return $this->days(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run weekly.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function weekly()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, 0)
|
||||
->spliceIntoPosition(5, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run weekly on a given day and time.
|
||||
*
|
||||
* @param int $day
|
||||
* @param string $time
|
||||
* @return $this
|
||||
*/
|
||||
public function weeklyOn($day, $time = '0:0')
|
||||
{
|
||||
$this->dailyAt($time);
|
||||
|
||||
return $this->spliceIntoPosition(5, $day);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run monthly.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function monthly()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, 0)
|
||||
->spliceIntoPosition(3, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run monthly on a given day and time.
|
||||
*
|
||||
* @param int $day
|
||||
* @param string $time
|
||||
* @return $this
|
||||
*/
|
||||
public function monthlyOn($day = 1, $time = '0:0')
|
||||
{
|
||||
$this->dailyAt($time);
|
||||
|
||||
return $this->spliceIntoPosition(3, $day);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run twice monthly.
|
||||
*
|
||||
* @param int $first
|
||||
* @param int $second
|
||||
* @return $this
|
||||
*/
|
||||
public function twiceMonthly($first = 1, $second = 16)
|
||||
{
|
||||
$days = $first.','.$second;
|
||||
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, 0)
|
||||
->spliceIntoPosition(3, $days);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run quarterly.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function quarterly()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, 0)
|
||||
->spliceIntoPosition(3, 1)
|
||||
->spliceIntoPosition(4, '*/3');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run yearly.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function yearly()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, 0)
|
||||
->spliceIntoPosition(2, 0)
|
||||
->spliceIntoPosition(3, 1)
|
||||
->spliceIntoPosition(4, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run every minute.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function everyMinute()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, '*');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run every five minutes.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function everyFiveMinutes()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, '*/5');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run every ten minutes.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function everyTenMinutes()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, '*/10');
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule the event to run every thirty minutes.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function everyThirtyMinutes()
|
||||
{
|
||||
return $this->spliceIntoPosition(1, '0,30');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the days of the week the command should run on.
|
||||
*
|
||||
* @param array|mixed $days
|
||||
* @return $this
|
||||
*/
|
||||
public function days($days)
|
||||
{
|
||||
$days = is_array($days) ? $days : func_get_args();
|
||||
|
||||
return $this->spliceIntoPosition(5, implode(',', $days));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the timezone the date should be evaluated on.
|
||||
*
|
||||
* @param \DateTimeZone|string $timezone
|
||||
* @return $this
|
||||
*/
|
||||
public function timezone($timezone)
|
||||
{
|
||||
$this->timezone = $timezone;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Splice the given value into the given position of the expression.
|
||||
*
|
||||
* @param int $position
|
||||
* @param string $value
|
||||
* @return $this
|
||||
*/
|
||||
protected function spliceIntoPosition($position, $value)
|
||||
{
|
||||
$segments = explode(' ', $this->expression);
|
||||
|
||||
$segments[$position - 1] = $value;
|
||||
|
||||
return $this->cron(implode(' ', $segments));
|
||||
}
|
||||
}
|
||||
30
vendor/laravel/framework/src/Illuminate/Console/Scheduling/Mutex.php
vendored
Normal file
30
vendor/laravel/framework/src/Illuminate/Console/Scheduling/Mutex.php
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
interface Mutex
|
||||
{
|
||||
/**
|
||||
* Attempt to obtain a mutex for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return bool
|
||||
*/
|
||||
public function create(Event $event);
|
||||
|
||||
/**
|
||||
* Determine if a mutex exists for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return bool
|
||||
*/
|
||||
public function exists(Event $event);
|
||||
|
||||
/**
|
||||
* Clear the mutex for the given event.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Event $event
|
||||
* @return void
|
||||
*/
|
||||
public function forget(Event $event);
|
||||
}
|
||||
145
vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php
vendored
Normal file
145
vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Illuminate\Console\Application;
|
||||
use Illuminate\Container\Container;
|
||||
use Symfony\Component\Process\ProcessUtils;
|
||||
|
||||
class Schedule
|
||||
{
|
||||
/**
|
||||
* All of the events on the schedule.
|
||||
*
|
||||
* @var \Illuminate\Console\Scheduling\Event[]
|
||||
*/
|
||||
protected $events = [];
|
||||
|
||||
/**
|
||||
* The mutex implementation.
|
||||
*
|
||||
* @var \Illuminate\Console\Scheduling\Mutex
|
||||
*/
|
||||
protected $mutex;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$container = Container::getInstance();
|
||||
|
||||
$this->mutex = $container->bound(Mutex::class)
|
||||
? $container->make(Mutex::class)
|
||||
: $container->make(CacheMutex::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new callback event to the schedule.
|
||||
*
|
||||
* @param string|callable $callback
|
||||
* @param array $parameters
|
||||
* @return \Illuminate\Console\Scheduling\CallbackEvent
|
||||
*/
|
||||
public function call($callback, array $parameters = [])
|
||||
{
|
||||
$this->events[] = $event = new CallbackEvent(
|
||||
$this->mutex, $callback, $parameters
|
||||
);
|
||||
|
||||
return $event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new Artisan command event to the schedule.
|
||||
*
|
||||
* @param string $command
|
||||
* @param array $parameters
|
||||
* @return \Illuminate\Console\Scheduling\Event
|
||||
*/
|
||||
public function command($command, array $parameters = [])
|
||||
{
|
||||
if (class_exists($command)) {
|
||||
$command = Container::getInstance()->make($command)->getName();
|
||||
}
|
||||
|
||||
return $this->exec(
|
||||
Application::formatCommandString($command), $parameters
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new job callback event to the schedule.
|
||||
*
|
||||
* @param object|string $job
|
||||
* @return \Illuminate\Console\Scheduling\CallbackEvent
|
||||
*/
|
||||
public function job($job)
|
||||
{
|
||||
return $this->call(function () use ($job) {
|
||||
dispatch(is_string($job) ? resolve($job) : $job);
|
||||
})->name(is_string($job) ? $job : get_class($job));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new command event to the schedule.
|
||||
*
|
||||
* @param string $command
|
||||
* @param array $parameters
|
||||
* @return \Illuminate\Console\Scheduling\Event
|
||||
*/
|
||||
public function exec($command, array $parameters = [])
|
||||
{
|
||||
if (count($parameters)) {
|
||||
$command .= ' '.$this->compileParameters($parameters);
|
||||
}
|
||||
|
||||
$this->events[] = $event = new Event($this->mutex, $command);
|
||||
|
||||
return $event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile parameters for a command.
|
||||
*
|
||||
* @param array $parameters
|
||||
* @return string
|
||||
*/
|
||||
protected function compileParameters(array $parameters)
|
||||
{
|
||||
return collect($parameters)->map(function ($value, $key) {
|
||||
if (is_array($value)) {
|
||||
$value = collect($value)->map(function ($value) {
|
||||
return ProcessUtils::escapeArgument($value);
|
||||
})->implode(' ');
|
||||
} elseif (! is_numeric($value) && ! preg_match('/^(-.$|--.*)/i', $value)) {
|
||||
$value = ProcessUtils::escapeArgument($value);
|
||||
}
|
||||
|
||||
return is_numeric($key) ? $value : "{$key}={$value}";
|
||||
})->implode(' ');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the events on the schedule that are due.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Foundation\Application $app
|
||||
* @return array
|
||||
*/
|
||||
public function dueEvents($app)
|
||||
{
|
||||
return collect($this->events)->filter->isDue($app);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the events on the schedule.
|
||||
*
|
||||
* @return \Illuminate\Console\Scheduling\Event[]
|
||||
*/
|
||||
public function events()
|
||||
{
|
||||
return $this->events;
|
||||
}
|
||||
}
|
||||
61
vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleFinishCommand.php
vendored
Normal file
61
vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleFinishCommand.php
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class ScheduleFinishCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'schedule:finish {id}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Handle the completion of a scheduled command';
|
||||
|
||||
/**
|
||||
* Indicates whether the command should be shown in the Artisan command list.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $hidden = true;
|
||||
|
||||
/**
|
||||
* The schedule instance.
|
||||
*
|
||||
* @var \Illuminate\Console\Scheduling\Schedule
|
||||
*/
|
||||
protected $schedule;
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Schedule $schedule
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Schedule $schedule)
|
||||
{
|
||||
$this->schedule = $schedule;
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
collect($this->schedule->events())->filter(function ($value) {
|
||||
return $value->mutexName() == $this->argument('id');
|
||||
})->each->callAfterCallbacks($this->laravel);
|
||||
}
|
||||
}
|
||||
68
vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php
vendored
Normal file
68
vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Console\Scheduling;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class ScheduleRunCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'schedule:run';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Run the scheduled commands';
|
||||
|
||||
/**
|
||||
* The schedule instance.
|
||||
*
|
||||
* @var \Illuminate\Console\Scheduling\Schedule
|
||||
*/
|
||||
protected $schedule;
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Schedule $schedule
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Schedule $schedule)
|
||||
{
|
||||
$this->schedule = $schedule;
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
$eventsRan = false;
|
||||
|
||||
foreach ($this->schedule->dueEvents($this->laravel) as $event) {
|
||||
if (! $event->filtersPass($this->laravel)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->line('<info>Running scheduled command:</info> '.$event->getSummaryForDisplay());
|
||||
|
||||
$event->run($this->laravel);
|
||||
|
||||
$eventsRan = true;
|
||||
}
|
||||
|
||||
if (! $eventsRan) {
|
||||
$this->info('No scheduled commands are ready to run.');
|
||||
}
|
||||
}
|
||||
}
|
||||
42
vendor/laravel/framework/src/Illuminate/Console/composer.json
vendored
Executable file
42
vendor/laravel/framework/src/Illuminate/Console/composer.json
vendored
Executable file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "illuminate/console",
|
||||
"description": "The Illuminate Console package.",
|
||||
"license": "MIT",
|
||||
"homepage": "https://laravel.com",
|
||||
"support": {
|
||||
"issues": "https://github.com/laravel/framework/issues",
|
||||
"source": "https://github.com/laravel/framework"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Taylor Otwell",
|
||||
"email": "taylor@laravel.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6.4",
|
||||
"illuminate/contracts": "5.4.*",
|
||||
"illuminate/support": "5.4.*",
|
||||
"nesbot/carbon": "~1.20",
|
||||
"symfony/console": "~3.2"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Illuminate\\Console\\": ""
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "5.4-dev"
|
||||
}
|
||||
},
|
||||
"suggest": {
|
||||
"guzzlehttp/guzzle": "Required to use the ping methods on schedules (~6.0).",
|
||||
"mtdowling/cron-expression": "Required to use scheduling component (~1.0).",
|
||||
"symfony/process": "Required to use scheduling component (~3.2)."
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
},
|
||||
"minimum-stability": "dev"
|
||||
}
|
||||
Reference in New Issue
Block a user