2016-03-28 3 views
2

У меня есть набор консольных команд, зарегистрированных в app/Console/Kernel.php. Моя Kernel.php выглядит,Пользовательская консольная команда Laravel, вызывающая конструктор всех других настраиваемых команд

<?php 

namespace App\Console; 

use Illuminate\Console\Scheduling\Schedule; 
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 

class Kernel extends ConsoleKernel 
{ 
    /** 
    * The Artisan commands provided by your application. 
    * 
    * @var array 
    */ 
    protected $commands = [ 
     Commands\ConsoleCommand1::class, 
     Commands\ConsoleCommand2::class 
    ]; 

    /** 
    * Define the application's command schedule. 
    * 
    * @param \Illuminate\Console\Scheduling\Schedule $schedule 
    * 
    * @return void 
    */ 
    protected function schedule(Schedule $schedule) 
    { 
     // Some code 
    } 
} 

Структура командной консоли класса выглядит,

<?php namespace App\Console\Commands; 

use Illuminate\Console\Command; 
use Dependancy; 

class ConsoleCommand1 extends Command 
{ 
    protected $signature = ‘console_command_1’; 
    protected $description = ‘This is the description’; 
    private $dependancy; 

    public function __construct(Dependancy $dependancy) 
    { 
     parent::__construct(); 
     $this->dependancy = $dependancy; 
    } 

    public function handle() 
    { 
     // Some code 
    } 
} 

Теперь проблема, когда я выполнить любую из команд консоли из списка, конструктор другой также получает исполнение с фактически выполненным.

Например, если я выполняю «php artisan console_command_1», конструктор «php artisan console_command_1» и «php artisan console_command_2» запускается и наоборот. Я действительно хочу, чтобы был вызван только конструктор «фактически выполненной команды artisan».

Разве это консольная консоль Laravel, или я что-то не так? Любая помощь высоко ценится.

ответ

10

Да, к сожалению, это единственный способ для Laravel определить, существует ли команда ремесленника или нет. Вот две основные вещи, которые происходят при выполнении команды:

1. При выполнении команды консоли, точка входа является файл artisan, расположенный в корневом каталоге вашего проекта. Это создает экземпляр ядра и calls the handle method on it, проходящий по полученным аргументам (которые: имя команды artisan и любые дополнительные аргументы, переданные для нее).

2.handle метод ядра была воля run the artisan command и для того, чтобы сделать это будет необходимо a console application instance (внутренне, которая определена как Artisan), который нужно будет позвонить resolveCommands, чтобы создать список команд, так что он может проверить, текущее имя команды действительно. Этот метод будет make a new instance из каждой команды, зарегистрированной в ядре (те, которые вы определили, а также все значения по умолчанию, загруженные из ArtisanServiceProvider).


Так на самом деле, так как в Kernel вы регистрация команды через ссылку на имя класса:

Commands\ConsoleCommand1::class 

И имя команды является защищенной собственностью этого класса:

protected $signature = ‘console_command_1’; 

Единственный возможный способ получить имя команды из класса - создать экземпляр этого класса, поэтому все конструкторы вызываются для создания всего списка команд.

+0

Действительно интересный материал. Спасибо за четкий ответ @Bogdan. –

+0

Забавно, что в документах показан пример с конструктором, но нет предупреждения о его использовании. Похоже, что подписи должны быть перенесены в ядро ​​в массиве. – jminkler

+0

Итак, если есть 10 консольных командных классов, laravel будет продолжать создавать классы? Потому что в моем случае, каждые 10 секунд я получаю журналы от конструкторов команд. Забавно, что я это заметил. – Farveaz

Смежные вопросы