Laravelで爆速API開発シリーズ第二弾は「ユーザ新規登録」です!
メールによる新規会員登録フローはかなり実装機会の多い機能なので本記事で徹底解説します。
この記事は、Laravelで爆速API開発シリーズ「ユーザログイン編」の続きなので未読の方はぜひチェックしてください!
目次
ゴール
今回作るものは
→ユーザがメールアドレスを入力するとそのメールアドレスに確認メールが送信される
→ユーザが確認メール中のリンクを踏むととアカウントが有効化される
というアプリを想定したAPIです。フローが複雑なので混乱しないように頭を整理しながら進めて行きましょう!
使うもの
有効化メールを送るAPIを作る
それでは、早速作って行きましょう!まずは仕様の確認です。
[POST]/registerにemailをリクエストした時、Laravelアプリケーション内で有効化コードを生成し保存します。また、有効化コードを含んだurlをメールで送ります。
今回はフロントエンド側は作りませんが、生成するurlは{フロントエンドのホストURL}/verify/:codeのようにしてフロントエンド側から受け取ったcodeをあとで作成するアカウント有効化のAPIに投げる想定です。
コントローラを作成する
まずは以下のコマンドを実行してRegisterControllerを作成しましょう。
php artisan make:controller RegisterController
生成されたコントローラにとりあえず以下のような仮のメソッドを定義しておきましょう。(リクエストの中のemailをそのまま返すだけです。)
public function register(Request $request) {
return $request->email;
}
ルーティングを作成する
routes/api.phpを開いての定義を記述します。
Route::post('register', '[email protected]');
一度確認のためPOSTMANで定義したAPIを叩いてみましょう。
こうなっていれば成功です!
モデルを作成する
有効化コードを保存する場所は色々な選択肢があるのですが、今回は全く新しいテーブルを作ってリクエストがきたらemailと生成された有効化コードを保存することにしましょう。
ターミナルを開いて以下のコマンドを実行しましょう。
php artisan make:model Activation -m
App/Activation.phpとともに空のマイグレーションファイルが作成されました。
マイグレーションを記述する
Activationテーブルにはメールアドレスと有効化コードを保存します。
database/migration/
XXXX_XX_XX_create_activations_table
を開いて以下のように記述しましょう。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateActivationsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up() {
Schema::create('activations', function (Blueprint $table) {
$table->increments('id');
$table->string('email');
$table->string('code');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('activations');
}
}
記述できたら
php artisan migrate
を実行してテーブルを作成しましょう。
有効化コードを生成する
今回は有効化コードにUUIDを使います。
UUIDとは理論上重複しないランダムな文字列を生成してくれるやつです。
ramsey/uuidをインストールしましょう。
composer require ramsey/uuid
インストールできたら先程作成したRegisterControllerに戻り、以下のような記述をします。
app/Http/Controllers/RegisterController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// UUIDライブラリ
use Ramsey\Uuid\Uuid;
// Activationモデル
use App\Activation;
class RegisterController extends Controller {
public function register(Request $request) {
$activation = new Activation;
$activation->email = $request->email;
$activation->code = Uuid::uuid4();
$activation->save();
}
}
先ほどと同じようにPOSTMANでリクエストを投げてみると以下のようなデータが作成されるはずです。
有効化メールを送る
それでは、生成された有効化コードを含んだメールを送りましょう。
Laravelはメール送信周りが非常に強力なのでさくっと終わります!
まずはmake:mailコマンドを使用して、mailableクラスを生成しましょう。
php artisan make:mail ActivationCreated --markdown=emails.activations.created
このコマンドを実行するとapp/Mailディレクトリに新しくActivationCreatedクラスが生成されます。
このMailableクラスを以下のように書き上げましょう。
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue; // Activationモデル
use App\Activation;
class ActivationCreated extends Mailable {
use Queueable, SerializesModels;
protected $activation;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Activation $activation) {
$this->activation = $activation;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$frontendURL = "http://example-front.com";
return $this->subject('アカウント有効化メール')
->markdown('emails.activations.created')
->with([
'link' => $frontendURL."/verify/{$this->activation->code}"
]);
}
}
また生成されたメールテンプレートは例えば以下のようになります。
resources/views/
emails/activations/
created.blade.php
@component('mail::message')
# 新規登録していただきありがとうございます!
下記のリンクをクリックしてアカウントの有効化を行ってください。
@component('mail::button', ['url' => $link])
アカウントの有効化
@endcomponent
Thanks,
{{ config('app.name') }}
@endcomponent
Laravelのマークダウンメールは最初見慣れないかもしれませんが、慣れるとかなり素早くメールを作成できるのでおすすめです。
メール関連を書き上げたら先ほどのRegisterControllerに戻りましょう。
以下がメール送信のロジックを含んだRegisterControllerです。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Ramsey\Uuid\Uuid; // UUIDライブラリ
// Activationモデル
use App\Activation;
// Mailファサード
use Illuminate\Support\Facades\Mail;
use App\Mail\ActivationCreated;
class RegisterController extends Controller {
public function register(Request $request) {
$activation = new Activation;
$activation->email = $request->email;
$activation->code = Uuid::uuid4();
$activation->save();
Mail::to($activation->email)->send(new ActivationCreated($activation));
}
}
それでは、POSTMANをと行きたいところですが、メール送信の設定をしましょう。
.envファイルを開き、以下の項目を埋めましょう。
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=XXXXXX
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME=テスト
設定を終えたらPOSTMANで叩いてみてください!
以下のようなメールが届けば成功です!
お疲れ様です。これにて有効化メールを送信するAPIを作る部分は終わりです。
次はアカウントを有効化するAPIを作ります。
アカウントを有効化するAPIを作る
目標は[POST] /activateに有効化コードを投げたらuserが作成されてJWTがかえるようにすることです。JWTについてはLaravelで爆速API開発シリーズ「ユーザログイン編」を参考にしてください。
コントローラロジックの作成
RegisterControllerを開いて以下を記述します。
use App\User;
use JWTAuth;
......
......
public function activate(Request $request) {
$code = $request->code;
if(!$this->checkCode($code)){
return response()->json(
['errors' => ['key' => ['認証キーが無効です。']]]
, 401);
}
$activation = Activation::where('code',$code)
->orderBy('created_at','desc')
->firstorFail();
$user = User::create([
'name' => $request->name,
'email' => $activation->email,
'password' => bcrypt($request->password),
]);
$token = JWTAuth::fromUser($user);
return response()->json(compact('token'));
}
/**
* コードが有効かチェックする
*/
private function checkCode($code){
$activation = Activation::where('code',$code)
->first();
if(!$activation){
return false;
}
$email = $activation->email;
$latest = Activation::where('email',$email)
->orderBy('created_at', 'desc')
->first();
$user = User::where('email',$email)->first();
return $code === $latest->code && !$user;
}
そしてroutes/api.phpに以下を記述します。
Route::post('activate', '[email protected]');
以下のようにPOSTMANで確認できれば成功です!
本当は有効化コードの期限を設定したり、いらなくなったコードを削除するロジックなどが必要なのですが、本記事では割愛させていただきます。長くなってしましましたがここら辺は一度覚えれば少しの応用でカバーできるのでしっかりマスターしてしまいましょう!
Laravelで爆速API開発シリーズはまだまだ続きますのでお楽しみに〜
Laravelのおすすめ本紹介
Laravelで爆速API開発シリーズ以外にも、Laravelの理解を深めたい方にはこちらの本がおすすめです!
PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応
Laravelの本は数多く出版されていますが、この本が断然わかりやすいと思います!
Laravelマスターを目指すならぜひ一度ご覧になってみるといいと思います。

WINDII

最新記事 by WINDII (全て見る)
- Canvaが最高すぎる。使い方を完全ガイド【チュートリアルあり】 - 2019年5月14日
- 人気急上昇中のLaravelをはじめよう!【徹底解説】 - 2019年4月23日
- Laravelの認可を理解して実装してみよう! - 2019年3月29日
コメント失礼いたします。
現在api認証システムを構築しています。
なべと申します。
そしてこちらのサイトを参考にさせていただいているのですが、
一番最後postmanにどのようなデータをどのように送ったらい
いのか教えていただけないでしょうか。
宜しくお願いいたします。
コメントありがとうございます!
画像がぼやけてますね…すみません?
↑の問題は修正いたしますが、とりいそぎ以下のurlから画像が見られるのでご確認ください!
https://tech.windii.jp/wp-content/uploads/2018/06/activation-example-1024×694.png
ほかにも不明点やおかしい点ありましたらコメントください〜
非常にわかりやすいです!
ありがとうございます!
これからもガンガン更新していくので、みてください〜?