比如 Lumen
,ConsoleServiceProvider
里面的
register
做了下面的处理:
\Laravel\Lumen\Console\ConsoleServiceProvider::register
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
public function register() { $this->registerCommands(array_merge( $this->commands, $this->devCommands )); }
protected function registerCommands(array $commands) { foreach (array_keys($commands) as $command) { call_user_func_array([$this, "register{$command}Command"], []); } $this->commands(array_values($commands)); }
public function commands($commands) { $commands = is_array($commands) ? $commands : func_get_args(); Artisan::starting(function ($artisan) use ($commands) { $artisan->resolveCommands($commands); }); }
public function resolveCommands($commands) { $commands = is_array($commands) ? $commands : func_get_args(); foreach ($commands as $command) { $this->resolve($command); } return $this; }
public function resolve($command) { return $this->add($this->laravel->make($command)); }
|
注意看上面的最后一个方法,这是所有命令 register
的时候都要做的一件事,也就是实例化, 也就是说,在我们命令行任何的
handle
方法运行之前,就需要实例化所有的
Command
了。 因为 Command
里面的
signature
、description
都是实例属性,需要实例化才能获取,要不然我们运行
php artisan
的时候就获取不到命令列表了。
因此,如果我们在 Command
的 __construct
里面做了一些影响全局的操作,有可能我们不会察觉得到,比如:
1
| \Cache::setPrefix('abc');
|
虽然你是在一个 Command
里面设置了 Cache
的
prefix
,但实际上你在其他 Command
里面的缓存前缀也会是你设置的这个。
简单地说,我们运行 php artisan
的时候,会把所有定义的
Command
实例化,如果我们需要做一些命令行初始化操作,最好放在
handle()
里面