在Laravel 5中调度应用程序/命令

时间:2015-06-25 07:10:09

标签: php laravel cron queue laravel-5

以下是在SendBirthdayEmailCommand目录

下创建的/App/Commands/命令
class SendBirthdayEmailCommand extends Command implements ShouldBeQueued {

    use InteractsWithQueue, SerializesModels;

    public function __construct()
    {

    }
}

handler diretory

中使用SendBirthdayEmailCommandHandler/App/Handlers/
class SendBirthdayEmailCommandHandler {

public function __construct()
{
    //
}


public function handle(SendBirthdayEmailCommand $command)
{
    //
        $reminders = \App\Reminder::all()->where('reminder_status','=','scheduled')
                     ->where('reminder_set','=','birthday')
                     ->where('reminder_type','=','email')
                     ->where('reminder_time','<=',  \Carbon\Carbon::now('Asia/Kolkata'));

       foreach ($reminders as $reminder) {
           $this->sendEmailNow($reminder);
       }
}

public function sendEmailNow($reminder_record)
{
    $reminderdata = $reminder_record;
    $from = $reminderdata->reminder_from;
    $to = $reminderdata->reminder_to;
    $msgstring = $reminderdata->reminder_msg;

   \Illuminate\Support\Facades\Mail::queueOn(
                'birthday_email', 
                ['html' => 'emails.bdaymailhtml'], 
                $msgstring, 
                function($message){
                  $message->from('reminder@example.com', 'Reeminder');
                  $message->to($to,'')->subject('Happy Birthday to You!');
                }

   );
 }
}

如何DispatchCommand来自日程安排的每1小时

Laravel doc仅显示调度控制台命令的示例,而不是App/Commands diretory

下的命令

修改1

更具体地说,我想从日程表中发送SendBirthdayEmailCommand 这是正确的方法吗?或者我必须显式创建一个控制台命令,然后在App/Commands

中调用我的命令

P.S。这两个命令引用令人困惑。 commands中的/App/Console/Commandsartisan console commands,我们称之为commands目录中的/App/Commandshandler目录中的/App/Handlers

修改2

根据@luceos https://stackoverflow.com/a/31043897/1679510

的建议

我使用了以下关闭来从SendBirthdayEmailCommand

发送/app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
    $schedule->command('inspire')
             ->hourly();
           $schedule->call(function()
            {
                $this->dispatch(new App\Commands\SendBirthdayEmailCommand());

            })->hourly();
}

为了利用内核中的dispatch()方法,我也做了以下

  1. Command Bus Facade提升为Kernel

    use Illuminate\Foundation\Bus\DispatchesCommands;
    
  2. Kernel

    中使用Facade
    class Kernel extends ConsoleKernel {
    
    use DispatchesCommands;
    /* rest of the code */
    }
    

    让我们看看它是否有效!!弄清楚如何在xampp上运行cron以让调度程序运行。

  3. 还不确定,如果出现任何错误,我将在哪里获得调试日志

    更新

    稍微玩一下内核然后运行php artisan找到了only console commands can be registered in kernel

    例如

    class Kernel extends ConsoleKernel {
    
    protected $commands = [
        'App\Console\Commands\Inspire',
        '\App\Commands\SendBirthdayEmailCommand', /* This will give error */
    ];
    }
    

    app/Commands/目录下的命令无法在内核中注册,因为它只接受instance of console commands

    这就是说,如果我们想在app/commands/MyCommand方法中用schedule 调用$schedule->command('mycmd')命令,我们是否必须创建一个显式的控制台命令?

1 个答案:

答案 0 :(得分:1)

您可以编辑app/Console/Kernel.php类并使用以下方法在schedule()方法下添加命令:

$schedule->command('birthday-email')->everyHour();

假设您使用属性App\Commands\SendBirthdayEmailCommandbirthday-email $name命名。

因为你有两门课,我认为你搞砸了。您需要将handle() SendBirthdayEmailCommandHandler方法移至SendBirthdayEmailCommand或从命令中调用方法。

如果你想调用任意东西,你也可以简单地使用调用方法:

schedule->call(function()
{
    // Do some task...

})->hourly();