let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【Laravelメールフォームその2】コントローラー・Mailableクラス・ルーティング・bladeテンプレート設定のしかた

更新: 2024/04/07 2919文字

今回は、前回行った『Laravelでメールフォームその1』の続きで、Laravelメールフォームを作っていきます。コントローラー・Mailableクラス・ルーティング・bladeテンプレート設定を行い、メール送信機能が使えるところまで進めます。さっそく内容を確認していきましょう。

前回の内容

前回は下準備ということで『外部SMTPサーバー設定・日本語対応・コマンドでコントローラーMailableクラスを作成』というところまでやりました。今回はここから、実際の処理部分のプログラムやフロント表示(bladeテンプレート)、ルーティングを設定していきます。

ページやファイル構成

ページの構成

表示で使うページは『トップ・確認・送信後』の3ページです。使用者には見えないですけど、ルーティング上は『送信処理』みたいなものも入っています。対応テンプレートは以下の通りです。

メールのトップ public/mail/
(/views/mail/index.blade.php)
確認ページ public/mail/confirm
(/views/mail/confirm.blade.php)
送信完了ページ public/mail/complete
(/views/mail/confirm.blade.php)

エディットするファイル

今回のメールフォームでエディットしていくファイルは、以下の通りとなります。コントローラーとMailableクラスは前回コマンドで作って、そのほかにテンプレートを追加しました。この記事ではMailForm01Sendって名前を付けているわりには、中で送信処理を行っていない点はご了承ください。 (*チームで作る案件のときは、内容に準拠した命名規則のほうがよいです。他の人がわからなくなるので。)

コントローラー
(/app/Http/Controllers)
MailForm01Controller.php
Mailableクラス
(/app/Mail/)
MailForm01Send.php
ルーティング
(/routes/)
web.php
テンプレート
(/resources/views/mail)
complete.blade.php(完了)
confirm.blade.php(確認)
index.blade.php(メールのトップ)
mailcontent.blade.php(メール本文)

Laravelメールフォーム コード一覧

ルーティング(/routes/web.php)

ポイントは通常のmailトップにアクセスしたときのメソッドは『get』で、それ以外は送信したフォームの値を扱うので『post』になります。コールバックのパスが長いけど、エイリアスにするとか、変数にして使いまわす、みたいなのもアリです。

コントローラー(/app/Http/Controllers/MailForm01Controller.php)

表示切り替え、バリデーション、送信処理を行います。冒頭の方でロードしたMailableクラスは、本文やメールヘッダーセットして送るときに使います。Mail::to送り先は、配列で渡すと複数わたせるようです(これで、自動返信と同じ内容が管理者にも届く)。

Mailableクラス(/app/Mail/MailForm01Send.php)

名前の割に実際には送信処理してないので、適切な名前があれば入れ変えたいところです。本文のセットや、Envelopeメソッドでヘッダー情報セット、みたいな形で使っています。Addressクラスは初期状態では書いてないので、useでインポートしました。

トップテンプレート(index.blade.php)

『@csrf』は、CSRF保護のディレクティブです(トークンセットみたいな感じ?無いと419)。{{old(〇〇)}}は、フォーム入力した前の状態を表示、みたいな関数。前の状態セットをphpで一から作ると、結構めんどくさかったです。

確認画面テンプレート(confirm.blade.php)

フォームのaction先は、MailForm01Controllerの送信メソッドとなります。値は送信した内容を取ってきて表示しているだけ。本文は改行タグが出力されるので、エスケープ処理はしない形にしました。

メール本文テンプレート(mailcontent.blade.php)

本文もサクッと。これ自体はMailableクラス内のcontentメソッドで、このテンプレートにそった本文としてセットされる、みたいな処理ですね。

送信完了画面テンプレート(complete.blade.php)

送信後はこの画面に。直接入った場合はトークンがセットされていないので419エラーになります。トップページリンクを書いているけど、リダイレクトとかでもよいかも。

表示・操作してみた例

ではさっそく操作してみましょう。トップページはこんな感じで、普通のフォームです。

確認画面です。戻ったときの、入力した値セットは、{{old(〇〇)}}がやってくれます。

送信後は、このページへ。

確認ページにフォーム入力しないで直接入るなど、トークンが無い・一致しないなどの不正な遷移の場合は、こういうエラー画面になるので、トップに戻って最初からきちんと操作すればokです。

実際のメールは、こんな感じで送られてきます。これがmailcontent.blade.phpでセットした内容です。

あとがき・まとめ

  • Laravelメールフォームはコントローラーやルーティングのほか、Mailableクラスも使う
  • bladeテンプレートでの入力した値セット{{old(〇〇)}}や、コントローラ・Mailableクラスの宛先セットは結構ラク

まとめると、こんなところでしょうか。管理人はいちからメールフォームを作ったこともありましたが、ルーティングや必要クラスさえ押さえてしまえば、Laravelのほうがサクサク制作できる印象をうけました。


【カテゴリ】- PHP
【タグ】- , ,

関連記事