2015-05-26 7 views
6

У меня есть пакет, содержащий команды Artisan. Я зарегистрировал эти команды с Artisan через моего провайдера услуг, как так:Как запланировать команды Artisan в пакете?

/** 
* Register the application services. 
* 
* @return void 
*/ 
public function register() 
{ 
    // Register Amazon Artisan commands 
    $this->commands([ 
     'App\Marketplace\Amazon\Console\PostProductData', 
     'App\Marketplace\Amazon\Console\PostProductImages', 
     'App\Marketplace\Amazon\Console\PostProductInventory', 
     'App\Marketplace\Amazon\Console\PostProductPricing', 
    ]); 
} 

Однако, эти команды должны быть запланированы для запуска ежедневно.

Я знаю, что в приложения/Console/Kernel.php есть schedule() метода, где вы можете зарегистрировать команды и их частоту, но как я могу запланировать команды в поставщике услуг моего пакета вместо?

+0

Почему вы не можете запланировать их в ядре? – MECU

+0

@MECU Потому что они находятся в пакете, а не в самом приложении Laravel. –

+0

Вы когда-нибудь разрешали это? Теперь я сталкиваюсь с той же проблемой. – sgrover

ответ

17

Для выяснения этого потребовалось много отладки и чтения через источник Ларавеля, но оказалось, что это довольно просто. Хитрость заключается в том, чтобы ждать, пока приложение не загрузится для планирования команд, поскольку именно тогда Laravel определяет экземпляр Schedule, а затем планирует команды внутри. Надеюсь, это спасет кого-то несколько часов мучительной отладки!

use Illuminate\Support\ServiceProvider; 
use Illuminate\Console\Scheduling\Schedule; 

class ScheduleServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     $this->app->booted(function() { 
      $schedule = $this->app->make(Schedule::class); 
      $schedule->command('some:command')->everyMinute(); 
     }); 
    } 

    public function register() 
    { 
    } 
} 
+4

Awesome. Отличная находка! –

+0

Спасибо! Его работы отличные – boksiora

+0

Это работает cooooool, спасибо –