以下是在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!');
}
);
}
}
如何Dispatch
此Command
来自日程安排的每1小时
Laravel doc仅显示调度控制台命令的示例,而不是App/Commands
diretory
修改1
更具体地说,我想从日程表中发送SendBirthdayEmailCommand
这是正确的方法吗?或者我必须显式创建一个控制台命令,然后在App/Commands
P.S。这两个命令引用令人困惑。 commands
中的/App/Console/Commands
是artisan console commands
,我们称之为commands
目录中的/App/Commands
及handler
目录中的/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()
方法,我也做了以下
将Command Bus Facade
提升为Kernel
use Illuminate\Foundation\Bus\DispatchesCommands;
在Kernel
类
class Kernel extends ConsoleKernel {
use DispatchesCommands;
/* rest of the code */
}
让我们看看它是否有效!!弄清楚如何在xampp上运行cron以让调度程序运行。
还不确定,如果出现任何错误,我将在哪里获得调试日志
更新
稍微玩一下内核然后运行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')
命令,我们是否必须创建一个显式的控制台命令?
答案 0 :(得分:1)
您可以编辑app/Console/Kernel.php
类并使用以下方法在schedule()
方法下添加命令:
$schedule->command('birthday-email')->everyHour();
假设您使用属性App\Commands\SendBirthdayEmailCommand
为birthday-email
$name
命名。
因为你有两门课,我认为你搞砸了。您需要将handle()
SendBirthdayEmailCommandHandler
方法移至SendBirthdayEmailCommand
或从命令中调用方法。
如果你想调用任意东西,你也可以简单地使用调用方法:
schedule->call(function()
{
// Do some task...
})->hourly();