Đăng bởi : Admin | Lượt xem : 2239 | Chuyên mục : Laravel
Tóm Tắt
1. Giới thiệu
Middleware cung ứng một chính sách thuận tiện để lọc những HTTP Request vào ứng dụng của bạn. Ví dụ : Laravel gồm có một Middleware xác định người dùng truy vấn vào ứng dụng của bạn. Nếu người dùng không được xác nhận, Middleware sẽ chuyến hướng người dùng đến màn hình hiển thị đăng nhập. Ngược lại, nếu người dùng được xác nhận, Middleware sẽ được cho phép Request liên tục vào ứng dụng
Middleware có thể được viết để thực hiện thêm các nhiệm vụ khác bên cạnh việc xác thực. Middleware CORS chịu trách nhiệm thêm các tiêu đề thích hợp cho tất các response rời khỏi ứng dụng của bạn. Middleware log có thể thục hiện ghi log cho tất cả các request tới ứng dụng
Bạn đang đọc: Bài 14: Middleware trong Laravel – Học lập trình Laravel
Vài middleware đã có sẵn trong Laravel framework, gồm có middleware cho bảo dưỡng, xác nhận, phòng chống CSRF và còn nữa. Tất cả những middleware này nằm trong thư mục app / Http / Middlware .
2. Tạo Middleware
Để tạo một middleware mới, những bạn hãy sử dụng câu lệnh Artisan : make : middleware php artisan make : middleware CheckAgeLệnh này sẽ tạo một class CheckAge trong thư mục app / Http / Middleware … Trong middleware này, tất cả chúng ta sẽ chỉ được cho phép truy vấn vào route nếu giá trị age lớn hơn 200. Nếu không, tất cả chúng ta sẽ chuyển hướng người dùng quay lại ‘ home ‘ URL .
Như những bạn đã thấy, nếu giá trị age đã cho nhỏ hơn hoặc bằng 200, middleware sẽ trả lại một HTTP chuyển hướng tới client ; ngược lại, request sẽ được gửi tiếp để giải quyết và xử lý. Để truyền request vào sâu hơn trong ứng dụng ( được cho phép middleware ” vượt qua ” ), đơn thuần chỉ cần gọi callback USD next với USD request. Tốt nhất là hãy tưởng tượng middleware là một chuỗi những ” layers ” trên HTTP request cần phải đi qua trước khi đi vào trong chương trình. Mỗi layer sẽ triển khai kiểm tra request và thậm chí còn hoàn toàn có thể huỷ phủ nhận request trọn vẹn .
3. Before và After Middleware
Việc một middleware chạy trước hay sau một request nhờ vào vào chính middleware nó. Ví dụ, middleware dưới đây sẽ thực thi vài tác vụ trước khi request được chương trình giải quyết và xử lý :
Tuy nhiên, middleware này sẽ triển khai trách nhiệm của mình sau khi request được ứng dụng giải quyết và xử lý :
4. Đăng ký Middleware
Global Middleware
Nếu bạn muốn một middleware chạy trong mỗi HTTP Request đến ứng dụng của bạn, đơn thuần chỉ cần thêm tên class của middleware đó vào trong thuộc tính $ middleware của class app / Http / Kernel. php .
Thiết lập Middleware cho Route
Nếu bạn muốn gán middleware cho những route đơn cử, thứ nhất bạn cần phải thêm middleware vào trong biến USD routeMiddleware trong file app / Http / Kernel. php và đặt cho nó một key :
// Within App\Http\Kernel Class...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
Sau khi đã được khai báo trong HTTP Kernel, bạn hoàn toàn có thể sử dụng khoá middleware để thiết lập thông số kỹ thuật cài vào trong route :
Route::get('admin/profile', function () {
//
})->middleware('auth');
Bạn cũng có thể chỉ định nhiều middleware cho route
Route::get('/', function () {
//
})->middleware('first', 'second');
Khi gán middleware, bạn cũng hoàn toàn có thể sử dụng tên class vừa đủ của middleware muốn :
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
Tạo nhóm Middleware
Đôi khi bạn muốn nhóm một số ít middleware bằng một khóa duy nhất để hoàn toàn có thể gán vào route thuận tiện hơn. Bạn hoàn toàn có thể làm điều này bằng cách sử dụng $ middlewareGroups của HTTP kernel .Về cơ bản, Laravel phân phối sẵn hai nhóm middleware thường sử dụng mà bạn hoàn toàn có thể muốn vận dụng cho web UI hay API :
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'auth:api',
],
];
Các nhóm middleware hoàn toàn có thể gán cho những route và controller action sử dụng cú pháp tương tự như như với từng middleware riêng. Việc sử dụng nhóm middleware sẽ làm cho việc gán những middleware vào trong một route trở nên tiện hơn :
Route::get('/', function () {
//
})->middleware('web');
Route::group(['middleware' => ['web']], function () {
//
});
Chú ý: Nhóm middleware web được tự động hóa vận dụng vào trong file routes.php qua RouteServiceProvider
Sắp xếp Middleware
Đôi khi, bạn cần middleware của mình để thực thi theo một thứ tự đơn cử nhưng không có quyền trấn áp thứ tự của chúng khi chúng được gán cho route. Trong trường hợp này, bạn hoàn toàn có thể chỉ định mức độ ưu tiên của middleware bằng cách sử dụng USD middlewarePriority ở trong : 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 = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
5. Middleware Parameters
Middleware cũng hoàn toàn có thể nhận những tham số truyền vào. Ví dụ, nếu chương trình cần xác nhận user đã được xác nhận có ” role ” đơn cử trước khi triển khai một thao tác nào đó, bạn hoàn toàn có thể tạo ra CheckRole để nhận tên của role như một tham số .Các tham số của middleware sẽ được truyền vào thành tham số của hàm handle ngay sau tham số USD next :
Tham số cho middleware cũng có thể được khai báo trên route bằng cách phân cách tên middleware và tham số bởi dấu :. Nhiều tham số phân cách nhau bởi dấu phẩy, :
Route::put('post/{id}', function ($id) {
//
})->middleware('role:editor');
6. Terminable Middleware
Đôi khi một middleware cần triển khai chỉ sau khi HTTP response đã được gửi xong cho trình duyệt. Ví dụ, ” session ” middleware đi kèm với Laravel phân phối session data cho storage sau khi response được gửi tới trình duyệt. Để làm được việc này, cần phải tạo một middleware kiểu ” kết thúc ” bằng cách thêm vào hàm terminate vào trong middleware :
Hàm terminate sẽ nhận cả request và response. Khi mà bạn khai báo một terminable middleware, bạn phải thêm nó vào trong list global middleware trong app / Http / Kernel. php .Khi gọi hàm terminate trong middleware, Laravel sẽ thực thi resolve một instance mới cho middleware từ service container. Nếu bạn muốn sử dụng cùng một instance khi mà handle và terminate được gọi, đăng kí middleware vào trong container sử dụng hàm singleton .
Source: https://final-blade.com
Category: Kiến thức Internet