Middleware trong CakePHP

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 18 tháng 1, 2025

Middleware là một lớp nằm giữa yêu cầu HTTP (request) và phản hồi HTTP (response) trong ứng dụng CakePHP. Nó được sử dụng để xử lý hoặc sửa đổi các yêu cầu trước khi chúng đến controller và các phản hồi trước khi chúng được gửi về trình duyệt.

1. Cách hoạt động của Middleware

Middleware hoạt động dựa trên chuỗi (middleware stack). Mỗi middleware trong chuỗi này sẽ:

  • Nhận yêu cầu từ middleware trước đó.
  • Xử lý yêu cầu (nếu cần).
  • Truyền yêu cầu cho middleware tiếp theo.
  • Xử lý phản hồi sau khi nó quay trở lại từ middleware tiếp theo.

2. Cấu hình Middleware

Middleware được cấu hình trong file Application.php, nằm trong thư mục src.

Ví dụ:

namespace App;

use Cake\Http\BaseApplication;
use Cake\Http\MiddlewareQueue;
use Cake\Routing\Middleware\RoutingMiddleware;
use Cake\Error\Middleware\ErrorHandlerMiddleware;

class Application extends BaseApplication
{
    public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
        // Thêm ErrorHandlerMiddleware để xử lý lỗi
        $middlewareQueue->add(ErrorHandlerMiddleware::class);

        // Thêm RoutingMiddleware để xử lý định tuyến
        $middlewareQueue->add(RoutingMiddleware::class);

        return $middlewareQueue;
    }
}

3. Tạo Middleware tùy chỉnh

Bạn có thể tạo middleware của riêng mình để thực hiện các chức năng đặc biệt như xác thực, ghi log, hoặc sửa đổi yêu cầu/ phản hồi.

Bước 1: Tạo middleware

Sử dụng lệnh sau để tạo middleware:

bin/cake bake middleware MyCustomMiddleware

Lệnh này sẽ tạo file MyCustomMiddleware.php trong thư mục src/Middleware.

Bước 2: Cập nhật middleware

Ví dụ một middleware tùy chỉnh:

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class MyCustomMiddleware
{
    public function __invoke(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // Trước khi truyền yêu cầu tới middleware tiếp theo
        $request = $request->withHeader('X-Custom-Header', 'CustomValue');

        // Truyền yêu cầu tới middleware tiếp theo
        $response = $handler->handle($request);

        // Sau khi nhận phản hồi từ middleware tiếp theo
        return $response->withHeader('X-Processed-By', 'MyCustomMiddleware');
    }
}
Bước 3: Thêm middleware vào chuỗi

Thêm middleware vừa tạo vào phương thức middleware() trong file Application.php:

$middlewareQueue->add(
    \App\Middleware\MyCustomMiddleware::class
);

4. Middleware có sẵn trong CakePHP

CakePHP cung cấp một số middleware hữu ích mặc định:

  • ErrorHandlerMiddleware: Xử lý lỗi và hiển thị trang lỗi.
  • RoutingMiddleware: Phân tích URL và khớp với các route đã định nghĩa.
  • CsrfProtectionMiddleware: Bảo vệ chống tấn công CSRF.
  • BodyParserMiddleware: Phân tích dữ liệu của các yêu cầu JSON hoặc XML.
  • EncryptedCookieMiddleware: Mã hóa và giải mã cookie.

5. Sử dụng Middleware với Plugin

Khi bạn sử dụng plugin trong CakePHP, bạn có thể thêm middleware từ plugin đó vào chuỗi bằng cách sử dụng PluginApplicationInterface. Ví dụ:

public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
    $middlewareQueue->add(new PluginMiddleware());
    return $middlewareQueue;
}

6. Lưu ý quan trọng

  • Thứ tự của middleware trong chuỗi rất quan trọng vì nó ảnh hưởng đến cách các middleware xử lý yêu cầu và phản hồi.
  • Đảm bảo rằng các middleware có chức năng quan trọng như ErrorHandlerMiddleware hoặc RoutingMiddleware được thêm đúng vị trí.

Kết luận

Middleware trong CakePHP là một công cụ mạnh mẽ để xử lý các yêu cầu và phản hồi HTTP. Bằng cách hiểu và sử dụng đúng middleware, bạn có thể dễ dàng mở rộng và tùy chỉnh ứng dụng của mình để đáp ứng các yêu cầu cụ thể.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ