Laravelには便利なスケジューラー機能があり、設定した処理を、決まったタイミングで実行してくれます。
コマンドとスケジューラー機能を使って、新規登録ユーザーに、Laravelから定期的にメールを送信する機能を搭載してみます。
「定期的な処理を自動化したい!」という方は、参考にしてください。
前半では、まずは開発環境で搭載し、そのあとエックスサーバーにデプロイしていきます。
エックスサーバーではcron(クロン)を使って自動処理を行いますが、この部分は後半で解説していきますね。
Laravel 定期処理を自動で実行①スケジューラーの設定方法
まずはスケジュールごとに実行する内容を作っておきます。
コマンドファイルを作成し、その中に処理を入れていきましょう。
なお、メールを送信するには、予めサーバー情報の登録などが必要になります。
エックスサーバーでの設定は、こちらを参考にしてください。
①コマンドファイル作成
次のコマンドを入力し「NewUser」というコマンドファイルを作成します。
1 |
php artisan make:command NewUser |
app/Console/Commands/NewUser.phpファイルを開きます。
ファイルの最初に、次の4つのuse宣言を入れておきます。
1 2 3 4 |
use Illuminate\Support\Facades\Mail; use App\Mail\WelcomeMail; use App\Models\User; use Carbon\Carbon; |
その下の protected $signature には、ファイルを実行するときのコマンドを登録します。
今回は、email:newuser としておきます。
1 |
protected $signature = 'email:newuser'; |
そのあとの protected $descriptionは、コマンドの説明を大まかに入れておきます。
1 |
protected $description = 'send email to new user after the registration'; |
ここは、コードと関係ないので、適当に書いてもOKです。
下部のpublic function handle()には、実行される処理を入れておきます。
1 2 3 4 5 6 7 8 |
public function handle() { $today = Carbon::today(); $users=User::wheredate('created_at', $today)->get(); foreach($users as $user){ return Mail::to($user->email)->send(new WelcomeMail($user)); } |
コードの意味Carbonを使って本日の日付を取得し、$todayに代入
作成日が本日のユーザーを取得し、$usersに代入
foreachで$usersを$userにし、$userごとにメールを送信する。
コマンドファイルの全体は、次のようになります。
Carbonを初めて使う場合は、インストールが必要になります。
下記コマンドを実行してください。
1 |
composer require nesbot/carbon |
②Kernel.phpに登録
次にapp/Console/Kernel.phpファイルを開き、ここに作成したコマンドを登録します。
protected $commandsには、次のように入れます。
1 |
$schedule->command('email:newuser')->everyMinute(); |
とりあえず、毎分実行されるようにしておきます。
コマンドが実行される時間間隔は、everyMinuteの部分を変えれば、変更できます。
変更例を下記に挙げておきます。
【スケジュール実行の時間間隔】
->everyMinute(); | 毎分タスク実行 |
->everyFiveMinutes(); | 5分毎にタスク実行 |
->hourly(); | 毎時タスク実行 |
->everyThreeHours(); | 3時間毎にタスク実行 |
->daily(); | 毎日深夜12時に実行 |
->dailyAt(’13:00′); | 毎日13:00に実行 |
->twiceDaily(1, 13); | 毎日1:00と13:00時に実行 |
->weekly(); | 毎週日曜日の00:00にタスク実行 |
->monthly(); | 毎月1日の00:00にタスク実行 |
->monthlyOn(4, ’15:00′); | 毎月4日の15:00に実行 |
*参考:https://readouble.com/laravel/8.x/ja/scheduling.html
④ メールの作成
次に、ユーザーに送信されるメールの内容を作成します。
次のコマンドで、新規mailを作成します。
1 |
php artisan make:mail WelcomeMail |
app/Mailの中にWelcomeMail.phpファイルができます。
19行目のconstruct~コードを追加していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class WelcomeMail extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public function __construct($user) { $this->user=$user; } /** * Build the message. * * @return $this */ public function build() { return $this->view('email.newuser') ->with(['user'=>$this->user])->subject('ご登録ありがとうございました'); } } |
送信されるメールの本文は、resources/views/emailフォルダの中のnewuser.blade.phpファイルに入れていきます。
⑤ビューファイルの作成
resources/viewsの中にemailフォルダを作り、この中にnewuser.blade.phpファイルを作ります。
とりあえず、次のような文章を入れておきます。
1 2 3 |
{{$user->name}}さん、 ようこそ♪ |
⑥テストする
これで準備OK。
とりあえず、新規ユーザーを登録したうえで、email:newuserコマンドを実行してみましょう。
1 |
php artisan email:newuser |
無事、メールが届いていれば成功です!
なお、schedule:runとしても、コマンドが実行されます。
1 |
php artisan schedule:run |
今回は定期処理をひとつしか登録しませんでしたが、定期処理は複数設定できます。
複数設定した場合、schedule:runを行えば、すべての処理を実行してくれます。
無事開発環境で動作したら、次はエックスサーバー上で動かしてみましょう。
この後の記事で解説していきます。
cronの設定がややクセがありますが、分かりやすく解説していきますね。