介绍
Artisan 是 Laravel 自带的命令行接口,他提供了许多使用的命令来帮助你构建 Laravel 应用
artisan 文件
#!/usr/bin/env php
<?php
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| First we need to get an application instance. This creates an instance
| of the application / container and bootstraps the application so it
| is ready to receive HTTP / Console requests from the environment.
|
*/
$app = require __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make(
'Illuminate\Contracts\Console\Kernel'
);
exit($kernel->handle(new ArgvInput, new ConsoleOutput));
首先我们创建了一个app实例(容器),然后创建 'Illuminate\Contracts\Console\Kernel’实例调用handle方法,关闭
分析
在实际开发中我们一般自定义Kernel继承’Illuminate\Contracts\Console\Kernel’来绑定到容器中,一般是在app/Console/Kernerl.php
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
}
}
handle 方法
/**
* Run the console application.
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return int
*/
public function handle($input, $output = null)
{
try {
$this->app->boot();
return $this->getArtisan()->run($input, $output);
} catch (Exception $e) {
$this->reportException($e);
$this->renderException($output, $e);
return 1;
} catch (Throwable $e) {
$e = new FatalThrowableError($e);
$this->reportException($e);
$this->renderException($output, $e);
return 1;
}
}
$this->app 指的artisan 文件中创建的application类,这里先进行 $this->app->boot(),是为了防止数据提供者没有进行注册;
$this->getArtisan();
use Illuminate\Console\Application as Artisan;
/**
* Get the Artisan application instance.
*
* @return \Illuminate\Console\Application
*/
protected function getArtisan()
{
if (is_null($this->artisan)) {
return $this->artisan = (new Artisan($this->app, $this->app->make('events'), $this->app->version()))
->resolveCommands($this->getCommands());
}
return $this->artisan;
}
/**
* 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;
}
这里创建了Console\Application 实例,并且将 Kernel 中的$this->getCommands() 加入到 Console\Application $commands属性中。
Kernel 中的$this->getCommands() 就是我们在 App\Console\Kernel $commands 中
自定义类 + 定时任务执行类 如下
/**
* Get the commands to add to the application.
*
* @return array
*/
protected function getCommands()
{
return array_merge($this->commands, [
'Illuminate\Console\Scheduling\ScheduleRunCommand',
]);
}
$this->getArtisan()->run($input, $output); run方法就是执行我们对应artisan 后续命令,简单来说就是根据$input 获取 命令名称,找到对应$comands里面的命令类,然后执行命令类中的handle方法,最后按照格式赋予$output属性进行输出