尤 川豪   ·  3月前
Exp. 1,209  ·  152 貼文  ·  114 留言

「註冊後收 Email 確認啟動帳號」功能的實作方式比較(Laravel)

Laravel 5.7 開始有官方內建這項功能可以用

我手上案子是 5.3 的需要自己實作 比較一下其他人的作法

https://lubus.in/blog/adding-email-verification-in-laravel-5-3-app-149?utm_source=learninglaravel.net

http://bensmith.io/email-verification-with-laravel

migration

$table->tinyInteger('verified')->default(0); // this column will be a TINYINT with a default value of 0 , [0 for false & 1 for true i.e. verified]
$table->string('email_token')->nullable(); // this column will be a VARCHAR with no default value and will also BE NULLABLE
$table->boolean('confirmed')->default(0);
$table->string('confirmation_code')->nullable();

都一樣 需要存驗證碼的欄位 需要存驗證與否的欄位

驗證碼

'email_token' => str_random(10),
$confirmation_code = str_random(30);

都是用 str_random 產生驗證碼

寄信手法

    DB::beginTransaction();
    try
    {
        $user = $this->create($request->all());
        // After creating the user send an email with the random token generated in the create method above
        $email = new EmailVerification(new User(['email_token' => $user->email_token, 'name' => $user->name]));
        Mail::to($user->email)->send($email);
        DB::commit();
        return back();
    }
    catch(Exception $e)
    {
        DB::rollback(); 
        return back();
    }
        User::create([
            'username' => Input::get('username'),
            'email' => Input::get('email'),
            'password' => Hash::make(Input::get('password')),
            'confirmation_code' => $confirmation_code
        ]);

        Mail::send('email.verify', $confirmation_code, function($message) {
            $message->to(Input::get('email'), Input::get('username'))
                ->subject('Verify your email address');
        });

都是在 controller 裡面 直接在註冊同時寄送

用 Laravel Events & Listeners 好像比較酷 可是沒關係 反正這樣比較簡單

阻擋未驗證帳號

use Illuminate\Http\Request;

// ...

public function credentials(Request $request)
{
    return [
        'email' => $request->email,
        'password' => $request->password,
        'verified' => 1,
    ];
}
        $credentials = [
            'username' => Input::get('username'),
            'password' => Input::get('password'),
            'confirmed' => 1
        ];

就是在 credential 加上驗證與否欄位

  分享   共 174 次點閱
共有 0 則留言
您的留言
尤 川豪
Exp. 1,209  ·  152 貼文  ·  114 留言

關於作者

Devs.tw 作者,喜歡分享&建造新東西的工程師。

技術部落格:轉個彎日誌

歡迎在 Facebook 追蹤我!

不定期分享有趣技術文章!