Register Dengan Mengirim Email Verifikasi Menggunakan Laravel 5.x— Part 1
Kali ini dapat kerjaan yang mengharuskan verifikasi user baru melalui email, tetapi semua itu lumayan mudah di lakukan dengan laravel, dengan menggunakan melakukan override method
dari RegisterController
(auth template laravel).
- Config email pada file .env
- Install auth scaffolding laravel
Override
methodregister()
padaRegisterController
- Buat listener event untuk mengirim email registrasi
- Membuat email template sederhana
- login logic dengan menggunakan
custom validator
Di atas adalah langkah-langkah secara umum yang saya lakukan untuk fitur yang akan kita buat. Dan kita mulai pada file .env
1. Config file .env untuk mengirim email
Gambar di atas merupakan konfigurasi dari file .env
untuk smtp gmail yang akan di gunakan sebagai pengirim ke masing-masing user yang registrasi. Pembahasan untuk file .env
tidak terlalu panjang lebar karna kita cuma mengisi key config
tersebut sesuai dengan apa yang kita gunakan.
2. Install auth scaffolding laravel
Langkah selanjutnya kita install auth scaffolding laravel
dengan mengetikkan perintah pada terminal atau command prompt
php artisan make:auth
Berikut contoh dan hasilnya.
Pada file web.php
dalam direktori routes akan terdapat route baru yaitu
Auth::routes();
Dan pada direktori resources/views
terdapat direktori yang di buat oleh auth laravel
sendiri dengan nama direktori auth
. Untuk instalasi auth scaffolding laravel
disini telah selesai, tugas kita selanjutnya membuat logic-nya atau override
method register()
pada RegisterController.
3. Override method register() pada RegisterController
Ok di tahap ini kita melakukan override
method register()
pada RegisterController
, mungkin akan timbul pertanyaan
Kenapa RegisterController? Kenapa method register()?
Untuk meyakinkan anda, silahkan jalankan perintah
php artisan route:list
maka akan tampil daftar seluruh route dari apa yang kita buat. Berikut contoh hasilnya
Dari gambar di atas kita bisa melihat route register
dengan method GET
di handle oleh RegisterController
dengan method register()
yang dimana RegisterController
tersebut terdapat pada app/Http/Controllers/Auth
.
Tetapi ketika membuka file RegisterController
kita sama sekali tidak mendapati method register(),
tentu kita tidak mendapati method tersebut, method tersebut terdapat pada file vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php
karena RegistersUsers
adalah trait
kita akan melihat pada RegisterController
seperti ini
Gambar di atas terlihat jelas dari penggunaan trait RegistersUsers,
untuk lebih jelasnya tentang trait anda bisa mencarinya sendiri, langkah selanjut nya kita akan melihat apa yang di lakukan method register()
public function register(Request $request)
{
$this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all()))); $this->guard()->login($user); return $this->registered($request, $user)
?: redirect($this->redirectPath());
}
Dari method register()
tersebut melakukan validasi inputan dari form, kemudian membuat user baru dengan method create()
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
Method create()
akan menghasilkan sebuah object dan object tersebut akan di parsing ke event Registered
, kemudian melakukan login dari object yang di hasilkan dari method create()
, karena method registered()
tidak mengembalikan nilai apapun jadi method registered()
ini akan mengalihkan halaman ke URL yang telah di tentukan dari variable $redirectTo
, yang terdapat pada RegisterController
. Penjelasan tentang method register()
dari trait RegistersUsers
selesai, kali ini kita akan mengubah sedikit dari method create()
dan melakukan override pada method register()
, tapi sebelumnya kita perlu menambah kolom pada table users
dengan is_active
dan token_register
yang dimana kolom is_active
untuk menentukan user sudah terverifikasi atau belum ketika user login, dan untuk token_register kita menggunakannya sebagai acuan saat verifikasi berlangsung.
Untuk file migration users
yang terdapat pada database/migrations/xxx_xx_xx_xxxxxx_create_users_table.php
tambah kan schema column dengan pada method up()
$table->boolean('active')->default(false);
$table->longText('token_register');
Sehingga hasil nya seperti ini
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->boolean('active')->default(false);
$table->longText('token_register');
$table->rememberToken();
$table->timestamps();
});
}
Dan ubah AppServiceProvider.php
dengan menambahkan code berikut ke dalam method boot()
\Illuminate\Support\Facades\Schema::defaultStringLength(191);
Kemudian migrate table users dengan command / perintah
php artisan migrate
Jangan lupa untuk update model Users
dengan menambahkan item nama kolom ke dalam array $fillable
, seperti ini
protected $fillable = [
'name',
'email',
'password',
'token_register',
'active'
];
Kita kembali ke RegisterController
ubah method create
sehingga menjadi seperti ini
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'token_register'=>str_random(190)
]);
}
Ketika user melakukan registrasi, random string di berikan kepada user yang akan menjadi penentu dari masing-masing user. Setelah method create()
, kita beralih ke method register()
dari trait
yang kita bahas sebelumnya. Tulis ulang method register()
ke dalam class RegisterController
dan hilangkan atau comment code pada $this->guard()->login($user);
dan return $this->registered($request, $user) ? : redirect($this->redirectPath());
dan berikan return berupa view()
atau pun text. Berikut contohnya.
public function register(Request $request)
{
$this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all())));// $this->guard()->login($user);// return $this->registered($request, $user)
// ? : redirect($this->redirectPath());
return view('auth.register-success');
}
Dan isi dari view register-success.blade.php
@extends('layouts.app')@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Register</div><div class="panel-body">
Register berhasil silahkan cek email anda.
</div>
</div>
</div>
</div>
</div>
@endsection
Karna default dari auth scaffolding sudah membuat event yaitu Registered
jadi kita melangkah ke MEMBUAT LISTENER UNTUK EVENT REGISTERED