How to schedule Artisan commands in a package?

家住魔仙堡 提交于 2021-02-05 20:09:49

问题


I have a package that contains Artisan commands. I’ve registered these commands with Artisan via my service provider like so:

/**
 * 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',
    ]);
}

However, these commands need to be scheduled to run daily.

I know in app/Console/Kernel.php there is the schedule() method where you can register commands and their frequency, but how can I schedule commands in my package’s service provider instead?


回答1:


It took a lot of debugging and reading through Laravel's source to figure this out, but it turned out to be pretty simple. The trick is to wait until after the Application has booted to schedule the commands, since that is when Laravel defines the Schedule instance and then schedules commands internally. Hope this saves someone a few hours of painful debugging!

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()
    {
    }
}



回答2:


In Laravel 6.10 and above:

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

class ScheduleServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->callAfterResolving(Schedule::class, function (Schedule $schedule) {
            $schedule->command('some:command')->everyMinute();
        });
    }

    public function register()
    {
    }
}


来源:https://stackoverflow.com/questions/30456737/how-to-schedule-artisan-commands-in-a-package

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!