How to Schedule Artisan Commands from Your Laravel Package

Table of Contents

Before you can run your command on the scheduler, you need to make sure you've actually registered the command with artisan.

To do this, use the $this->commands method in your ServiceProvider::boot method.

class MyPackageServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->commands([
            Commands\MyAwesomeCommand::class,
        ])
    }
}

By doing this, you can now run your command using php artisan my-awesome-command.

Now that artisan is aware of your command, you can hook it up to Laravel's Schedule and run it as often as you need.

Begin by calling $this->app->afterResolving in your ServiceProvider::boot method, passing through two arguments.

The first argument should be the abstract that is being resolved. In this case, that will be Illuminate\Console\Scheduling\Schedule. The second argument should be a Closure that accepts the object in its parameter list.

use Illuminate\Console\Scheduling\Schedule;

class MyPackageServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->commands([
            Commands\MyAwesomeCommand::class,
        ])
		  
        $this->app->afterResolving(Schedule::class, function (Schedule $schedule) {
            $schedule->command(Commands\MyAwesomeCommand::class)->everyMinute();
        });
    }
}

Now when you run php artisan schedule:run, the Closure will be executed and MyAwesomeCommand will be added to the scheduler, running once every minute.

Enjoyed this post or found it useful? Please consider sharing it on Twitter.