LARAVEL: Get an array of scheduled tasks for output in admin dashboard

前端 未结 3 1604
深忆病人
深忆病人 2020-12-16 17:51

Using the Laravel task scheduler I have created a number of tasks in Kernel.php

e.g:

$schedule->command(\'some:command\')
    ->daily();

$sche         


        
相关标签:
3条回答
  • 2020-12-16 18:23

    I was having the task to stop/enable and edit the frequency of the scheduled tasks from the admin dashboard. So I foreach them in Kernel.php and capture the output in function.

    $enabled_commands = ConsoleCommand::where('is_enabled', 1)
            ->get();
    
        foreach ($enabled_commands as $command)
        {
            $schedule->command($command->command_name)
                ->{$command->frequency}($command->time)
                ->after(function () use ($command) {
                    $this->log($command->command_name);
                });
        }
    

    Hope this help you.

    0 讨论(0)
  • 2020-12-16 18:30

    There's actually no support out of the box for this, unfortunately. What you'll have to do is extend the artisan schedule command and add a list feature. Thankfully there's a simple class you can run:

    <?php
    
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    use Illuminate\Console\Scheduling\Schedule;
    
    class ScheduleList extends Command
    {
        protected $signature = 'schedule:list';
        protected $description = 'List when scheduled commands are executed.';
    
        /**
         * @var Schedule
         */
        protected $schedule;
    
        /**
         * ScheduleList constructor.
         *
         * @param Schedule $schedule
         */
        public function __construct(Schedule $schedule)
        {
            parent::__construct();
    
            $this->schedule = $schedule;
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            $events = array_map(function ($event) {
                return [
                    'cron' => $event->expression,
                    'command' => static::fixupCommand($event->command),
                ];
            }, $this->schedule->events());
    
            $this->table(
                ['Cron', 'Command'],
                $events
            );
        }
    
        /**
         * If it's an artisan command, strip off the PHP
         *
         * @param $command
         * @return string
         */
        protected static function fixupCommand($command)
        {
            $parts = explode(' ', $command);
            if (count($parts) > 2 && $parts[1] === "'artisan'") {
                array_shift($parts);
            }
    
            return implode(' ', $parts);
        }
    }
    

    This will provide you with a php artisan schedule:list. Now that's not exactly what you need, but then you can easily get this list from within your Laravel stack by executing:

    Artisan::call('schedule:list');
    

    And that will provide you with a list of the schedule commands.

    Of course, don't forget to inject the Facade: use Illuminate\Support\Facades\Artisan;

    0 讨论(0)
  • 2020-12-16 18:34

    As your not running through the console you need to invoke the schedule method on the Kernel in your controller... (don't forget to make the schedule method public instead of protected).

    public function index(\Illuminate\Contracts\Console\Kernel $kernel, \Illuminate\Console\Scheduling\Schedule $schedule)
    {
        $kernel->schedule($schedule);
        dd($schedule->events());
    }
    
    0 讨论(0)
提交回复
热议问题