Wed Dec 2019 1 year ago

Pengertian Middleware dan Penggunaannya Laravel 5.8

Pengertian dan Penggunaan Middleware Laravel 5.8

#Pengenalan

Middleware menyediakan mekanisme yang nyaman untuk memfilter permintaan HTTP memasuki aplikasi Anda. Misalnya, Laravel menyertakan middleware yang memverifikasi bahwa pengguna aplikasi Anda diautentikasi. Jika pengguna tidak diautentikasi, middleware akan mengarahkan pengguna ke layar login. Namun, jika pengguna diautentikasi, middleware akan memungkinkan permintaan untuk melanjutkan lebih jauh ke dalam aplikasi.

Middleware tambahan dapat ditulis untuk melakukan berbagai tugas selain otentikasi. Middleware CORS mungkin bertanggung jawab untuk menambahkan tajuk yang tepat untuk semua tanggapan yang meninggalkan aplikasi Anda. Middleware logging mungkin mencatat semua permintaan yang masuk ke aplikasi Anda.

Ada beberapa middleware yang termasuk dalam kerangka Laravel, termasuk middleware untuk otentikasi dan perlindungan CSRF. Semua middleware ini berada di direktori. app/Http/Middleware

 

#Menentukan Middleware

 

Untuk membuat middleware baru, gunakan perintah Artisan: make:middleware

php artisan make:middleware CheckAge

Perintah ini akan menempatkan CheckAge kelas baru di dalam direktori Anda . Di middleware ini, kami hanya akan mengizinkan akses ke rute jika yang disediakan lebih besar dari 200. Jika tidak, kami akan mengarahkan pengguna kembali ke URI: app/Http/Middlewareagehome

<?php

namespace AppHttpMiddleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }
}

 

Sebelum & Setelah Middleware

Seperti yang Anda lihat, jika yang diberikan age kurang dari atau sama dengan 200, middleware akan mengembalikan pengalihan HTTP ke klien; jika tidak, permintaan akan diteruskan lebih lanjut ke dalam aplikasi. Untuk meneruskan permintaan lebih dalam ke aplikasi (memungkinkan middleware untuk "lulus"), hubungi panggilan $next balik dengan $request.

Yang terbaik adalah membayangkan middleware karena serangkaian "HTTP" harus melalui permintaan HTTP sebelum mereka menekan aplikasi Anda. Setiap lapisan dapat memeriksa permintaan dan bahkan menolak seluruhnya.

Apakah middleware berjalan sebelum atau setelah permintaan tergantung pada middleware itu sendiri. Misalnya, middleware berikut akan melakukan beberapa tugas sebelum permintaan ditangani oleh aplikasi:

<?php

namespace AppHttpMiddleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // Perform action

        return $next($request);
    }
}

Namun, middleware ini akan melakukan tugasnya setelah permintaan ditangani oleh aplikasi:

<?php

namespace AppHttpMiddleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}

 

Mendaftarkan Middleware

 

Middleware Global

Jika Anda ingin middleware dijalankan selama setiap permintaan HTTP ke aplikasi Anda, daftarkan kelas middleware di $middleware properti kelas Anda .app/Http/Kernel.php

 

Menetapkan Middleware Untuk Route

Jika Anda ingin menetapkan middleware ke route tertentu, Anda harus terlebih dahulu menetapkan kunci middleware dalam file Anda . Secara default, properti dari kelas ini berisi entri untuk middleware yang disertakan dengan Laravel. Untuk menambahkan milik Anda, tambahkan ke daftar ini dan berikan kunci pilihan Anda: app/Http/Kernel.php$routeMiddleware

// Within AppHttpKernel Class...

protected $routeMiddleware = [
    'auth' => AppHttpMiddlewareAuthenticate::class,
    'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
    'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
    'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
    'can' => IlluminateAuthMiddlewareAuthorize::class,
    'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
    'signed' => IlluminateRoutingMiddlewareValidateSignature::class,
    'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
    'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,
];

Setelah middleware didefinisikan di kernel HTTP, Anda dapat menggunakan middleware metode untuk menetapkan middleware ke route:

Route::get('admin/profile', function () {
    //
})->middleware('auth');

Anda juga dapat menetapkan beberapa middleware untuk route:

Route::get('/', function () {
    //
})->middleware('first', 'second');

Saat menetapkan middleware, Anda juga dapat memberikan nama kelas yang sepenuhnya memenuhi syarat:

use AppHttpMiddlewareCheckAge;

Route::get('admin/profile', function () {
    //
})->middleware(CheckAge::class);

 

Group Middleware

Terkadang Anda mungkin ingin mengelompokkan beberapa middleware di bawah satu tombol untuk membuatnya lebih mudah untuk ditetapkan ke route. Anda dapat melakukan ini menggunakan $middlewareGroups properti kernel HTTP Anda.

Di luar kotak, Laravel dilengkapi dengan webdan apigrup middleware yang berisi middleware umum yang mungkin ingin Anda terapkan ke UI web dan rute API Anda:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        AppHttpMiddlewareEncryptCookies::class,
        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
        IlluminateSessionMiddlewareStartSession::class,
        IlluminateViewMiddlewareShareErrorsFromSession::class,
        AppHttpMiddlewareVerifyCsrfToken::class,
        IlluminateRoutingMiddlewareSubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

Grup Middleware dapat ditugaskan ke route dan tindakan pengontrol menggunakan sintaksis yang sama dengan middleware individual. Sekali lagi, group middleware membuatnya lebih mudah untuk menetapkan banyak middleware ke route sekaligus:

Route::get('/', function () {
    //
})->middleware('web');

Route::group(['middleware' => ['web']], function () {
    //
});

 

 

Mengurutkan Middleware

Jarang, Anda mungkin perlu middleware Anda untuk mengeksekusi dalam urutan tertentu tetapi tidak memiliki kendali atas pesanan mereka ketika mereka ditugaskan ke rute. Dalam hal ini, Anda dapat menentukan prioritas middleware Anda menggunakan $middlewarePriority properti file Anda :app/Http/Kernel.php

/**
 * The priority-sorted list of middleware.
 *
 * This forces non-global middleware to always be in the given order.
 *
 * @var array
 */
protected $middlewarePriority = [
    IlluminateSessionMiddlewareStartSession::class,
    IlluminateViewMiddlewareShareErrorsFromSession::class,
    AppHttpMiddlewareAuthenticate::class,
    IlluminateSessionMiddlewareAuthenticateSession::class,
    IlluminateRoutingMiddlewareSubstituteBindings::class,
    IlluminateAuthMiddlewareAuthorize::class,
];

 

Parameter Middleware

Middleware juga dapat menerima parameter tambahan. Misalnya, jika aplikasi Anda perlu memverifikasi bahwa pengguna yang diautentikasi memiliki "peran" yang diberikan sebelum melakukan tindakan yang diberikan, Anda dapat membuat CheckRole middleware yang menerima nama peran sebagai argumen tambahan.

Parameter middleware tambahan akan diteruskan ke middleware setelah $next argumen:

<?php

namespace AppHttpMiddleware;

use Closure;

class CheckRole
{
    /**
     * Handle the incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

Parameter Middleware dapat ditentukan saat mendefinisikan rute dengan memisahkan nama dan parameter middleware dengan a :. Beberapa parameter harus dibatasi oleh koma:

Route::put('post/{id}', function ($id) {
    //
})->middleware('role:editor');

 

Middleware Terminable

Terkadang middleware mungkin perlu melakukan beberapa pekerjaan setelah respons HTTP dikirim ke browser. Sebagai contoh, middleware "sesi" yang disertakan dengan Laravel menulis data sesi ke penyimpanan setelah respons dikirim ke browser. Jika Anda menentukan terminate metode di middleware dan server web Anda menggunakan FastCGI, terminate metode tersebut akan secara otomatis dipanggil setelah respons dikirim ke browser.

<?php

namespace IlluminateSessionMiddleware;

use Closure;

class StartSession
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store the session data...
    }
}

The terminate Metode harus menerima baik permintaan dan respon. Setelah Anda mendefinisikan middleware yang dapat diakhiri, Anda harus menambahkannya ke daftar rute atau middleware global dalam file. app/Http/Kernel.php

Saat memanggil terminate metode di middleware Anda, Laravel akan menyelesaikan contoh baru dari middleware dari wadah layanan . Jika Anda ingin menggunakan contoh middleware yang sama ketika handle dan terminate metode dipanggil, daftarkan middleware dengan wadah menggunakan metode wadah singleton.

belajar laravel tutorial laravel definisi middleware middleware laravel laravel