高级进阶学习
Laravel 高级进阶版
☕ 任务调度(Scheduler)
1,配置 Scheduler
打开 app/Console/Kernel.php
文件,你会看到 schedule
方法,这里是定义任务的地方:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*/
protected function schedule(Schedule $schedule): void
{
// 每天早上8点执行 report:daily 命令
//$schedule->command('report:daily')->dailyAt('08:00');
$schedule->command('report:daily')->everyMinute();
}
/**
* Register the commands for the application.
*/
protected function commands(): void
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
2,SendDailyReport
php artisan make:command SendDailyReport
<?php
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
class SendDailyReport extends Command
{
// 命令签名
protected $signature = 'report:daily';
// 命令描述
protected $description = 'Send daily report email to all users';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$this->info('开始发送每日报告邮件');
// 获取所有用户
$users = User::all();
$this->info('找到用户数量: ' . $users->count());
if ($users->isEmpty()) {
$this->error('没有找到用户。');
return;
}
foreach ($users as $user) {
try
{
Mail::raw('这是您的日报告内容', function ($message) use ($user) {
$message->to($user->email)
->from(config('services.mail.mail_gmail'), config('services.mail.mail_name'),)
->subject('每日报告');
});
$this->info('邮件成功发送给: ' . $user->email);
}
catch (\Exception $e)
{
$this->error('邮件发送失败给 ' . $user->email . ': ' . $e->getMessage());
}
}
$this->info('每日报告邮件发送成功。');
}
}
3,ENV 设置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ex_sh
DB_USERNAME=root
DB_PASSWORD=
MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=11db8c1f10c50d
MAIL_PASSWORD=667fe814a795e7
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=HooBusiness@example.com
MAIL_FROM_NAME=Hoo
4,php artisan migrate
创建用户
5,启动 Scheduler
php artisan schedule:run
自动执行 php artisan report:daily
在 Windows 环境中,可以使用 任务计划程序 来设置定时任务。
设置步骤:
-
打开任务计划程序:按下
Win + R
键,输入taskschd.msc
并按回车。 -
创建基本任务:
- 点击右侧的 “创建基本任务”。
- 输入任务名称,例如 “Laravel Report Daily”。
-
设置触发器:
- 在触发器页面,选择 “每天” 或其他所需频率。
- 指定开始时间,例如
08:00
。
-
设置操作:
-
在操作页面,选择 “启动程序”。
-
程序或脚本路径 输入你的 PHP 可执行文件路径,例如
D:\php-8.3.10\php.exe
。 -
添加参数处输入
artisan report:daily
,例如:
D:\Code\Laravel P\example-app2\artisan report:daily
-
-
保存并完成
☕ 事件与监听器(Event & Listener)
场景:用户注册后发送欢迎邮件
当新用户注册后,我们触发一个事件 UserRegistered
,然后监听器 SendWelcomeEmail
会捕获该事件并发送一封欢迎邮件。
1, 安装
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeEmail --event=UserRegistered
2,定义事件和监听器逻辑
打开 app/Events/UserRegistered.php
并编辑如下内容:
namespace App\Events;
use App\Models\User;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class UserRegistered
{
use Dispatchable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
3,在监听器文件中编写发送邮件的逻辑
打开 app/Listeners/SendWelcomeEmail.php
文件,添加如下代码:
namespace App\Listeners;
use App\Events\UserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Mail;
class SendWelcomeEmail implements ShouldQueue
{
use InteractsWithQueue;
public function __construct()
{
// 可选的:在构造函数中进行初始化
}
public function handle(UserRegistered $event)
{
$user = $event->user;
Mail::raw('欢迎来到我们的网站!', function ($message) use ($user) {
$message->to($user->email)
->subject('欢迎!');
});
}
}
4,注册事件和监听器
打开 app/Providers/EventServiceProvider.php
,在 $listen
数组中注册事件和监听器:
namespace App\Providers;
use App\Events\UserRegistered;
use App\Listeners\SendWelcomeEmail;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
UserRegistered::class => [
SendWelcomeEmail::class,
],
];
public function boot()
{
parent::boot();
}
}
5,触发事件
在用户注册的逻辑中触发 UserRegistered
事件。比如在用户控制器中添加如下代码:
php artisan make:controller UserController