Search code examples
laravellaravel-5

How to run command in Laravel kernel after another successful command


I'm creating a custom command which will truncate a table every thirty minutes in the console kernel (for development purposes). I want to run another right after the previous command.

P.S: I have an if statement which prevents running these commands on the production server.

$schedule->command('db:seed')->after(function () use ($schedule) : void {
    $schedule->command('my-command:remove-users-from-tables')
        ->everyThirtyMinutes()
        ->environments(['demo', 'local']);
});

I expect to run the seeder right after "my-command" runs successfully every thirty minutes. However, in this way, only db:seed runs.


Solution

  • I have checked the source code for Illuminate\Console\Scheduling\Schedule class.

    I think when we say:

    $schedule->command(...);
    

    The artisan command will be scheduled, not run straightaway.

    So when you write like this:

    $schedule->command('first-command')->after(function () use ($schedule) {
        $schedule->command('second-command');
    });
    

    The second command will be registered, not run right after the first command.

    So the best approach that I can think of is run the second command inside the first command according to this link

    You might try something like this:

    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    
    class RemoveUsersFromTable extends Command
    {
        public function handle()
        {
            // Do something to remove users from table.
    
            $this->call('db:seed');
        }
    }