Header Ads Widget

Sử dụng Middleware


Middleware cung cấp các tiện ích filtering HTTP xác thực user đăng nhập vào ứng dụng hoặc xử lý các tình huống khi khách vào website
Có thể viết thêm middleware để thực hiện nhiều tác vụ khác ngoài việc xác thực vào hệ thống được thiết lập tại thư mục app/Http/Middleware
CORS middleware có trách nhiệm thêm các header thích hợp vào trong tất cả các response gửi ra ngoài ứng dụng. 
Logging middleware ghi log cho tất cả các request tới ứng dụng.

CSRF protection chứng thực

Tạo mới một middleware

php artisan make:middleware CheckData 

Thêm nội dung bên dưới vào bên trong hàm handle
if (!$request->secure() && App::environment() === 'production') {
return redirect()->secure($request->getRequestUri());
}
return $next($request);

Đoạn code trên kiểm tra nếu người dùng truy cập vào đường link Http sẽ tự được điều hướng sang liên kết chứa https

Before & After Middleware


Chạy trước khi Request được xử lý
public function handle($request, Closure $next)
    {
        // Perform action

        return $next($request);
    }

Hoặc sau khi Request được xử lý xong
public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }

Global Middleware


Để middleware có thể chạy trong mọi HTTP request tới ứng dụng cần set class middleware trong thuộc tính $middleware của class app/Http/Kernel.php.

Assigning Middleware To Routes

Chỉ định một middleware cho route cụ thể $routeMiddleware trong app/Http/Kernel.php.

Mỗi middleware được định nghĩa trong HTTP kernel,  có thể sử dụng phương thức middleware để chỉ định middleware cho một route:
Route::get('admin/profile', function () { // })->middleware('auth');

Chỉ định nhiều middleware cho route:
Route::get('/', function () { // })->middleware('first', 'second');

Chỉ định middleware cho route:
Route::get('admin/profile', function () { // })->middleware(CheckData::class);

Middleware Groups

Middleware group được gán vào routes và controller sử dụng cú pháp tương tự như với middleware đơn lẻ.

Middleware Parameters

Middleware cũng có thể nhận thêm các tham số truyền vào. Ví dụ, nếu ứng dụng của bạn cần xác thực có "role" cụ thể trước khi thực hiện một thao tác nào đó, bạn có thể tạo một CheckRole middleware để nhận tên của role như một tham số.

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}


Tham số middleware có thể được khai báo trên route bằng cách phân chia tên middleware và tham số bởi dấu :. Nhiều tham số thì cần được phân chia bởi dấy phẩy:
Route::put('post/{id}', function ($id) { // })->middleware('role:editor');

Terminable Middleware

Đôi khi một middleware có thể cần thực hiện sau khi HTTP response đã được gửi xong cho trình duyệt. Ví dụ, "session" middleware có trong Laravel ghi dữ liệu session cho storage sau khi response được gửi tới trình duyệt. Nếu bạn định nghĩa một phương thức terminate vào trong middleware, nó sẽ tự động được gọi sau khi response được gửi tới trình duyệt.
<?php

namespace Illuminate\Session\Middleware;

use Closure;

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

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


Phương thức terminate có thể nhận cả request response. Mỗi khi định nghĩa terminable middleware, cần thêm vào danh sách global middleware trong file app/Http/Kernel.php.

Hàm terminate trong middleware sẽ giải quyết instance mới cho middleware từ service container. Nếu bạn muốn sử dụng cùng một middleware instance khi mà phương thức handle terminate được gọi, hãy đăng ký middleware vào trong container sử dụng phương thức singleton tại AppServiceProvider.php
use App\Http\Middleware\TerminableMiddleware;
public function register()
{
    $this->app->singleton(TerminableMiddleware::class);
}

Nhận xét