menu

Laravel - Authentification (login)


Pada tutorial sebelumnya kita sudah menyiapkan landing page dan migration file untuk sistem login, pada tutorial kali ini kita akan  membuat sistem loginnya.

Oke, langsung saja kita mulai prakteknya,

Pertama, buat route baru untuk sistem login ini dengan mengedit file web.php pada path protected/app/routes/ menjadi seperti ini,
.
.
.
//login
Route::get('login', 'Controller\Auth\AuthController@indexLogin');
Route::post('login', 'Controller\Auth\AuthController@login');
.
.
.

Selanjutnya, buat function controller baru dengan mengedit file AuthController.php pada path protected/app/controllers/auth/ menjadi seperti ini,
<?php namespace Controller\Auth;

use Model\User;
use \Input;
use \View;
use \Validator;
use \Hash;
use \Redirect;
use \Auth;
use \Session;

class AuthController extends \BaseController
{
 public function indexLogin()
 {
  return View::make('auth.login');
 }

 public function login() 
 {
  $user = NULL;
  // Check whether input is an email or username
  $field = Validator::make(
     array('email' => Input::get('username', '')),
     array('email' => 'email'))
     ->passes() ? 'email' : 'username';
  $credentials = array(
   $field   => Input::get('email'), 
   'password'  => Input::get('password', '')
  );

  $remember = Input::get('remember', '1') == '1' ? true : false;

  $status = INVALID_CREDENTIAL;

  if(Auth::attempt($credentials, $remember)) {
   $user = Auth::user();
   $status = OK;
  }

  // For Logging
  Session::put(SESSION_LOG_STATUS, $status);
  Session::put(SESSION_LOG_TYPE, LOGGING_UPDATE);
  Session::put(SESSION_LOG_MODEL, $user);
  // dd($user);
  return Redirect::to('');
 }
}

Kemudian, tambahkan field remember token pada database dengan mengedit file {tanggal}_create_users_table.php pada path protected/app/database/migration/ menjadi seperti ini,
<?php
//ini database laravel
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

 /**
  * Run the migrations.
  *
  * @return void
  */
 public function up()
 {
  Schema::create('users', function($table){
   $table->increments('id');
   $table->string('name');
   $table->string('username')->unique('username');
   $table->string('email')->unique('email');
   $table->string('password');
   $table->string('remember_token', 100)->nullable();
   $table->timestamps();
  });
 }

 /**
  * Reverse the migrations.
  *
  * @return void
  */
 public function down()
 {
  Schema::drop('users');
 }

}

Setelah itu, tambahkan beberapa constant baru untuk keperluan sistem login ini dengan mengedit file constants.php pada path protected/app/ menjadi seperti ini,
.
.
.
// Localization
 define('trans', 'Lang::get');

 // Session Logging
 define('SESSION_LOG'  , 'logging');
 define('SESSION_LOG_TYPE' , 'logging.type');
 define('SESSION_LOG_MODEL' , 'logging.model');
 define('SESSION_LOG_STATUS' , 'logging.status');

 // Logging type
 define('LOGGING_CREATE'  , 'create');
 define('LOGGING_UPDATE'  , 'update');
 define('LOGGING_DELETE'  , 'delete');
 define('LOGGING_RESTORE' , 'restore');

 //Auth
 define('OK', 'OK');
 define('INVALID_CREDENTIAL', 'INVALID_CREDENTIAL');

Terakhir edit file blade header.blade.php pada path protected/app/views/layouts/web/ menjadi seperti ini,
<div class="header">
 <div class="banner">
  <div class="welcome">Welcome</div>
  {{-- code dibawah ini menggunakan constant variabel --}}
  <div class="gambar"><a href="#"><img src="{{ IMAGE_HEADER }}" style="width:"100px" height="129px";"></a></div>
 </div>
 <hr>
 <div class="menu">
  <div class="kiri">
   <li>
    <div class="dropdown">
      <button class="btn btn-default">Menu(css)</button>
      <div class="dropdown-content">
        <a href="{{ URL::to('crud/users')}}">User</a>
        <a href="{{ URL::to('book')}}">Index Book</a>
        <a href="{{ URL::to('javaScript/js1')}}">Belajar Script</a>
        <a href="{{ URL::to('javaScript/js2')}}">Belajar Script2</a>
        <a href="{{ URL::to('javaScript/js3')}}">Belajar Script3</a>
        <a href="{{ URL::to('javaScript/js4')}}">Belajar Script4</a>
        <a href="{{ URL::to('javaScript/js5')}}">Belajar Script5</a>
        <a href="{{ URL::to('javaScript/js6')}}">Belajar Script6</a>
        <a href="{{ URL::to('javaScript/js7')}}">Belajar Script7</a>
      </div>
    </div>
   </li>
   <li>
     <div class="dropdown-script">
      <button onclick="myFunction()" class="dropbtn btn btn-default">Translate</button>
      <div id="myDropdown" class="dropdown-content-script">
        <a href="{{ URL::to('lang/en') }}">English</a>
        <a href="{{ URL::to('lang/ina') }}">Indonesia</a>
      </div>
     </div>
   </li>
  </div>
  <div class="kanan">
   @if(Auth::user())
    <li onclick="location.href='{{ URL::to('') }}';">Logout</li>
   @else
    <li onclick="location.href='{{ URL::to('login') }}';">Login</li>
   @endif
   <li onclick="location.href='{{ URL::to('/') }}';">Cari</li>
  </div>
 </div>
</div>

Dan edit juga file blade hello.blade.php untuk melihat flecnya, file ini terletak pada path protected/app/views/web/ edit menjadi seperti ini,

@extends('layouts/web/master')

<?php $title = "Welcome" ?>

@section('script')
@stop

@section('content')
<div class="isi">
 <h4>{{ trans('translate.welcome_to_codedoct'); }} @if(Auth::user()){{Auth::user()->name}}@else Guest @endif</h4>
 <br>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt facilis, dolore similique maiores? Doloribus, asperiores. Iusto debitis tempora velit repellat sed autem, quaerat commodi, necessitatibus soluta quos libero voluptatibus eum.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt facilis, dolore similique maiores? Doloribus, asperiores. Iusto debitis tempora velit repellat sed autem, quaerat commodi, necessitatibus soluta quos libero voluptatibus eum.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt facilis, dolore similique maiores? Doloribus, asperiores. Iusto debitis tempora velit repellat sed autem, quaerat commodi, necessitatibus soluta quos libero voluptatibus eum.</p>
</div>
@stop

Sehingga tampilan saat tidak sedang login akan tampak seperti ini,


Sedangkan tampilan saat sedang login akan tampak seperti ini,


===DONE!===

WHY?
1. Error undefined method User::newQuery() ?

ini disebabkan karena ada nama class yang sama sehingga membuat class tersebut tidak sinkron dengan parameter yang digunakan. Dalam hal ini nama class yang sama adalah class model dengan class migration, cara memperbaikinya yaitu dengan mengganti nama file class migrationnya.
Ikuti saja langkah tutorial sebelumnya dengan baik dan benar, maka error ini tidak akan terjadi.

2. Error Class '\User' not found

ini disebabkan karena, nama model pada auth salah, cara memperbaikinya buka file auth.php pada path protected/app/config/ cari 'model' => 'bla..bla..bla', isi bla..bla..bla dengan nama model yang akan digunakan sebagai auth, dalam hal ini kita akan menggunakan model User maka edit menjadi seperti ini 'model' => 'Model\User',.