Tutorial Implementasi login dengan username atau email pada Laravel 5.6+


Berikut ini tutorial login dengan username atau email untuk versi Laravel 5.6 ke atas. Dengan implementasi berikut anda memungkinkan pengguna untuk login dengan menggunakan username ataupun email pada aplikasi berbasis Laravel.

Login atau Register dengan Username/Email untuk Laravel

Biasanya, para developer Laravel pasti langsung menggunakan User Authentication seperti Login, Register, dan Forgot Password bawaan dari Laravel. Nah User Authentication bawaan Laravel ini hanya memungkinkan pengguna untuk login dengan menggunakan alamat email saja. Bagaimana jika kita ingin memungkinkan pengguna untuk login ataupun buat akun dengan username ataupun email mereka?

Implementasi Login dengan Username/Email

1.  Generate User Authentication pada Laravel dengan php artisan make:auth

2. Buka LoginController.php yang telah di-publish oleh Laravel setelah kita menjalankan perintah di atas.  Lalu ubah isi function username() dengan kode di bawah.

   /**
     * Change username from only 'username' to allow login with either 'email' or 'username
     *
     * @return string
     */
    public function username()
    {
        $login = request()->input('identity');

        $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
        request()->merge([$field => $login]);

        return $field;
    }

Kode di atas akan mengecek apakah yang diinputkan oleh pengguna adalah username atau email dengan menggunakan fungsi bawaan PHP yaitu `filter_var` dan memasukkan FILTER_VALIDATE_EMAIL pada parameter kedua. 

3. Buka login.blade.php yang juga telah di-publish oleh Laravel setelah kita menjalankan make:auth, atau laman login yang Anda buat sendiri. Pada login.blade.php ini, berikan name="identity" dalam input.

<input type="text" name="identity" class="form-control" placeholder="Username/Email">

4. Jangan lupa untuk mengubah isi kode untuk memvalidasi request login yang diinputkan oleh pengguna di LoginController.php

    /**
     * Validate the user login request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function validateLogin(Request $request)
    {
        $messages = [
            'identity.required' => 'Nama Pengguna atau email harus diisi.',
            'email.exists' => 'Nama Pengguna atau email belum terdaftar',
            'username.exists' => 'Nama Pengguna atau email belum terdaftar',
            'password.required' => 'Password harus diisiin juga',
        ];

        $request->validate([
            'identity' => 'required|string',
            'password' => 'required|string',
            'email' => 'string|exists:users',
            'username' => 'string|exists:users',
        ], $messages);
    }

Dengan begini, aplikasi Laravel anda sudah memungkinkan pengguna agar dapat login dengan username/email mereka dalam satu field.

Implementasi Register dengan Username/Email

Berbeda dengan login, untuk User Register, anda tetap harus menambahkan field input baru untuk username, karena bawaan dari Laravel hanya menyisipkan field input register.

1. Buka RegisterController.php, dan ubah isi kode dari function create() dengan kode di bawah

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'username' => strtolower($data['username']),
            'password' => Hash::make($data['password']),
            'avatar' => 'user/avatar/user-default.png',
        ]);
    }

2. Masih di RegisterController.php, ubah isi kode pada function Validator()

/**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        $messages = [
            'name.required' => 'Anda harus mengisikan nama lengkap anda.',
            'username.required' => 'Nama Pengguna harus diisi.',
            'username.unique' => 'Nama Pengguna sudah diambil, pilih yang lain.',
            'email.required' => 'Alamat email juga isiin dong',
            'email.unique' => 'Alamat email udah terdaftar, sudah punya akun?',
            'password.required' => 'Password isiin juga',
        ];

        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'username' => ['required', 'string', 'max:20', 'unique:users'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:6'],
        ], $messages);
    }

Dengan perubahan diatas, sekarang aplikasi Laravel anda mendukung pembuatan akun baru dengan email, dan username.

Jangan lupa untuk menambahkan kolom baru di database SQL (MySQL/PostgreSQL) anda dengan tipe string dan diberi nama username.

Sekian tutorial implementasi login dengan username/email di Laravel, dan register dengan username & email.