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.
Đ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
Hoặc sau khi Request được xử lý xong
Để 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.
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:
Chỉ định nhiều middleware cho route:
Chỉ định middleware cho route:
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:
Phương thức terminate có thể nhận cả request và 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 và 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
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
Thêm nội dung bên dưới vào bên trong hàm handle
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 actionreturn $next($request);}
Hoặc sau khi Request được xử lý xong
public function handle($request, Closure $next){$response = $next($request);// Perform actionreturn $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ố.<?phpnamespace 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.<?phpnamespace 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 và 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 và 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
Đăng nhận xét