Belajar Laravel (Chapter 12 | Tutorial Middleware)

Tobi Ahmad
dotlocal
Published in
4 min readApr 13, 2020

Middleware dibuat sebagai filter dari request yang masuk web. Sebagai contoh, kita bisa membuat middleware untuk memverifikasi apakah user pada website statusnya sudah login, jika belum login maka middleware akan mengarahkan user pada halaman login. Tapi jika user sudah login makan middleware akan mengarahkan ke halaman dashboard.

Ada banyak middleware yang sudah disediakan oleh Laravel, misalkan seperti buat authentication dan CSRF protection. Untuk melihat middleware yang sudah terdaftar bisa buka file app/Http/Kernel.php.

Semua file middleware tersimpan pada folder app/Http/Middleware

Scope of This Chapter

Pada tutorial ini kita akan membahas tentang Middleware pada Laravel

Buat Middleware

  • Untuk membuat middleware bisa menggunakan perintah Artisan make:middleware, contohnya :
php artisan make:middleware Admin 
  • Perintah diatas telah membuat file baru pada app/ Http/ Middleware/ Admin.php
// Edit file app/Http/Middleware/Admin.php<?phpnamespace App\Http\Middleware;use Closure;class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
  • Tambahkan logic pada function handle untuk filter request pada middleware Admin, contohnya filter apakah user sudah login dan role “admin”:
// Edit file app/Http/Middleware/Admin.php<?phpnamespace App\Http\Middleware;use Closure;
use Auth;
class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::user()->role == ‘admin’) {
return $next($request);
}
return redirect(‘/’);
}
}
  • Daftarkan middleware Admin pada app/Http/Kernel.php
// Edit file app/Http/Kernel.php

protected $routeMiddleware = [
.....
‘admin’ => \App\Http\Middleware\Admin::class,
];

Sekarang sudah ada custom middleware dengan nama “admin”.

  • Tambahkan Middleware pada route
// Edit file routes/web.phpRoute::get(‘posts’, ‘PostController@index’)->middleware(‘admin’);

Gunakan function middleware pada route yang ingin di filter menggunakan middleware Admin.

#Middleware pada Routes

// routes/web.phpRoute::get('home', 'HomeController@index')->middleware('auth');

Multiple middleware pada route

// routes/web.phpRoute::get('home', 'HomeController@index')->middleware('auth','admin');

Middleware Groups

// routes/web.phpRoute::group([‘middleware’ => [‘admin’]], function () {
Route::get(‘home’, ‘HomeController@index’);
});
Route::middleware(['auth', 'admin'])->group(function () {
Route::get('home', 'HomeController@index');
});

#Middleware pada Controller

Jika ingin menambahkan middleware pada controller bisa tambahkan method middleware() pada contructor class

// Edit controller HomeController.php<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class HomeController extends Controller
{

function __construct()
{
$this->middleware(‘admin’);
}
public function index()
{
$data = [‘Tegal Kota Bahari’, ‘Jakarta Panas’]; return view(‘posts’, compact(‘data’));
}
}

Multiple Middleware Controller

class HomeController extends Controller
{

function __construct()
{
$this->middleware(‘admin’);
$this->middleware(‘auth’);
}
}

Only Middleware Controller

Kita bisa membatasi middleware hanya untuk method tertentu pada class controller. Misalkan kita ingin menambahkan middleware admin hanya untuk method index dan edit

class HomeController extends Controller
{

function __construct()
{
$this->middleware('admin')->only('index','edit');
}
public function index()
{
// Method index
}
public function show()
{
// Method show
}
public function edit()
{
// Method edit
}
}

Except Middleware Controller

Kita bisa tambahkan middleware except. Misalkan kita ingin menambahkan middleware admin untuk semua method kecuali method show.

class HomeController extends Controller
{

function __construct()
{
$this->middleware('admin')->except('show');
}
public function index()
{
// Method index
}
public function show()
{
// Method show
}
public function edit()
{
// Method edit
}
}

Middleware Parameters

Middleware bisa menerima parameters, contohnya kita ingin membuat middleware CheckRole yang mengirim parameters “editor”.

Tambahan untuk middleware paramenters ditulis setelah argument $next.

  • Buat middleware CheckRole, lalu edit:
// edit Middleware CheckRole.php
<?php
namespace App\Http\Middleware;use Closure;class CheckRole
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
return $next($request);
}
return redirect(‘/login’);
}
}
  • Pada model user tambahkan logic pada method hasRole(), yang akan mengecek apakah parameters sama dengan field usertype pada database table users:
// model User.phpclass User extends Authenticatable
{
public function hasRole($role)
{
// check param $role dengan field usertype
if ($role == $this->usertype) {
return true;
}
return false;
}
}
  • Daftarkan middleware CheckRole pada app/Http/Kernel.php
// Edit file app/Http/Kernel.php

protected $routeMiddleware = [
.....
‘role’ => \App\Http\Middleware\CheckRole::class,
];
  • Edit file routes/web.php, untuk menambahkan params bisa menggunakan tanda :
Route::get(‘home’, ‘HomeController@index’)->middleware(‘role:editor’);

Multiple Middleware Parameters

Middleware bisa menerima beberapa parameters, contohnya kita ingin membuat middleware CheckRole yang mengirim parameters 2 sekaligus “editor,admin”.

Tambahan untuk middleware paramenters ditulis setelah argument $next.

  • Buat middleware CheckRole, lalu edit:
// edit Middleware CheckRole.php
<?php
namespace App\Http\Middleware;use Closure;class CheckRole
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, ...$roles)
{
foreach ($roles as $role) {
if (! $request->user()->hasRole($role)) {
return $next($request);
}
}
return redirect(‘/login’);
}
}
  • Pada model user tambahkan logic pada method hasRole(), yang akan mengecek apakah parameters sama atau tidak dengan field usertype pada database table users:
// model User.phpclass User extends Authenticatable
{
public function hasRole($role)
{
// check param $role dengan field usertype
if ($role == $this->usertype) {
return true;
}
return false;
}
}
  • Daftarkan middleware CheckRole pada app/Http/Kernel.php
// Edit file app/Http/Kernel.php

protected $routeMiddleware = [
.....
‘role’ => \App\Http\Middleware\CheckRole::class,
];
  • Edit file routes/web.php, untuk menambahkan parameters bisa menggunakan tanda titik dua ( : ) dan untuk multiple parameters bisa dengan tanda koma ( , ) .
Route::get(‘home’, ‘HomeController@index’)->middleware(‘role:admin,editor’);Route::group(['middleware' => ['role:admin,editor']], function () {
Route::get('home', 'HomeController@index');
});

Next Chapter

https://medium.com/dotlocal/belajar-laravel-chapter-13-tutorial-csrf-protection-8ce2f82c4ce

Support the Author

Jika suka dengan artikel ini, bisa support saya ditautan berikut ini https://karyakarsa.com/tobidsn :)

Cheers
Tobi Ahmad
Founder of Dot Local

--

--

Tobi Ahmad
dotlocal

Web Developer, Blogger, & Open source enthusiast.