Thời gian đọc: 5 phút
Trong CodeIgniter 3, khái niệm middleware không được hỗ trợ một cách trực tiếp như trong một số framework PHP khác (ví dụ: Laravel). Tuy nhiên, bạn có thể sử dụng Hooks để đạt được chức năng tương tự. Hooks cho phép bạn can thiệp vào quá trình xử lý của ứng dụng tại các điểm cụ thể, giúp thực hiện các thao tác trước hoặc sau khi một controller được gọi.
Dưới đây là hướng dẫn chi tiết về cách triển khai middleware trong CodeIgniter 3 bằng cách sử dụng Hooks.
Trước tiên, bạn cần đảm bảo rằng tính năng Hooks được kích hoạt trong ứng dụng của bạn. Mở file application/config/config.php
và tìm dòng sau và Thay đổi giá trị FALSE
thành TRUE
:
$config['enable_hooks'] = TRUE;
Tiếp theo, bạn sẽ tạo một file PHP mới trong thư mục application/hooks/
. Ví dụ, tạo file Middleware.php
.
Nội dung của Middleware.php
:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Middleware {
public function check_auth() {
$CI =& get_instance();
$controller = $CI->router->class;
$method = $CI->router->method;
// Danh sách các controller/method không cần xác thực
$excluded = array(
'login/index',
'home/index',
);
if (!in_array("$controller/$method", $excluded)) {
if (!$CI->session->userdata('logged_in')) {
redirect('login');
}
}
}
}
Giải thích:
Sau khi tạo file Hook, bạn cần cấu hình để CodeIgniter biết khi nào gọi đến nó. Mở file application/config/hooks.php
và thêm đoạn sau:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$hook['post_controller_constructor'][] = array(
'class' => 'Middleware',
'function' => 'check_auth',
'filename' => 'Middleware.php',
'filepath' => 'hooks',
'params' => array()
);
Giải thích:
post_controller_constructor
: Hook này sẽ được gọi sau khi controller được khởi tạo.class
: Tên lớp trong file Hook (Middleware
).function
: Phương thức sẽ được gọi (check_auth
).filename
: Tên file Hook (Middleware.php
).filepath
: Đường dẫn đến file Hook, tính từ thư mục application
(hooks
).Bạn có thể tạo nhiều phương thức trong lớp Middleware
để phục vụ cho các mục đích khác nhau.
Ví dụ: Kiểm tra quyền truy cập
public function check_permission() {
$CI =& get_instance();
// Logic kiểm tra quyền truy cập
}
$hook['post_controller_constructor'][] = array(
'class' => 'Middleware',
'function' => 'check_permission',
'filename' => 'Middleware.php',
'filepath' => 'hooks',
'params' => array()
);
Nếu bạn cần truyền tham số vào phương thức Hook, bạn có thể sử dụng params
trong cấu hình Hook.
Ví dụ:
Cập nhật hooks.php
:
$hook['post_controller_constructor'][] = array(
'class' => 'Middleware',
'function' => 'check_role',
'filename' => 'Middleware.php',
'filepath' => 'hooks',
'params' => array('admin', 'editor')
);
public function check_role($roles) {
$CI =& get_instance();
// Logic kiểm tra vai trò người dùng
}
Biến $roles chính là array(‘admin’, ‘editor’)
Nếu bạn muốn áp dụng Middleware cho một số controller hoặc method nhất định, bạn có thể tùy chỉnh logic trong phương thức Hook.
Ví dụ:
public function check_auth() {
$CI =& get_instance();
$controller = $CI->router->class;
$method = $CI->router->method;
// Chỉ áp dụng cho controller 'dashboard'
if ($controller == 'dashboard') {
// Logic kiểm tra xác thực
}
}
Lợi ích:
Hạn chế:
Mặc dù CodeIgniter 3 không hỗ trợ middleware một cách trực tiếp, bạn vẫn có thể sử dụng Hooks để thực hiện các chức năng tương tự. Bằng cách tận dụng Hooks, bạn có thể kiểm soát luồng xử lý của ứng dụng một cách hiệu quả và linh hoạt.
Hy vọng hướng dẫn này sẽ giúp bạn triển khai middleware trong CodeIgniter 3 một cách dễ dàng. Nếu bạn có bất kỳ thắc mắc nào, hãy để lại bình luận hoặc liên hệ để được hỗ trợ thêm.