Làm thế nào để xây dựng một hệ thống định tuyến phía máy chủ cơ bản trong PHP.

Được thực hiện bởi Aaron Sekisambu

Trong ngữ cảnh của ứng dụng web phía máy chủ, hệ thống định tuyến là một phần của ứng dụng web ánh xạ yêu cầu HTTP đến trình xử lý yêu cầu (hàm / phương thức). Một yêu cầu HTTP bao gồm một tiêu đề và tùy chọn một cơ thể. Tiêu đề chứa thông tin về yêu cầu ví dụ phương thức, đường dẫn và máy chủ lưu trữ. Một số phương thức như GET, HEAD và OPTION không sử dụng phần thân yêu cầu trong khi các phương thức khác như POST, PUT và PATCH sử dụng nó để truyền dữ liệu từ máy khách đến máy chủ.

Sử dụng một hệ thống định tuyến cho phép chúng tôi cấu trúc ứng dụng của mình theo cách tốt hơn thay vì chỉ định từng yêu cầu cho một tệp.

Một hệ thống định tuyến hoạt động bằng cách ánh xạ một yêu cầu HTTP đến một trình xử lý yêu cầu dựa trên phương thức yêu cầu và đường dẫn được chỉ định trong URL của yêu cầu. Đây chính xác là những gì chúng ta sẽ xây dựng trong hướng dẫn này.

Yêu cầu.

  • Bạn cần PHP phiên bản 5 trở lên chạy trên máy phát triển của bạn.
  • Kiến thức cơ bản về PHP bao gồm sự quen thuộc với các biến toàn cầu PHP.
  • Một sự hiểu biết về PHP hướng đối tượng.

Tuyên bố từ chối trách nhiệm.

  • Bộ định tuyến này sẽ chỉ xử lý các yêu cầu GET và POST.
  • Tôi sẽ không sử dụng các công cụ và thư viện ưa thích. Không có nhà soạn nhạc, không tự động tải. Tôi muốn tiếp tục tập trung vào khái niệm.
  • Kiểm thử đơn vị là tuyệt vời nhưng tôi sẽ không làm điều đó, với mục đích giữ cho hướng dẫn này ngắn. (Xin lỗi các nhà phát triển tốt)
  • Mã tôi sẽ viết không phải là mã sẵn sàng sản xuất.

Hãy bắt đầu nào.

Sử dụng thiết bị đầu cuối, tạo một thư mục cho dự án và cd vào thư mục.

$ mkdir bộ định tuyến php
$ cd php-router

Tạo 4 tệp trong thư mục như hình dưới đây.

$ touch index.php Request.php IRequest.php Router.php

index.php - Đây là tệp nhập cho ứng dụng web. Đây là nơi chúng tôi sẽ khởi tạo bộ định tuyến và xác định các tuyến đường của chúng tôi. Nó cũng sẽ chứa tất cả hàng nhập khẩu.

Request.php - Tệp này sẽ chứa một lớp cho lớp Request để khởi tạo các đối tượng có chứa thông tin về yêu cầu HTTP.

IRequest.php Tập tin này sẽ chứa giao diện mà lớp Request phải thực hiện.

Router.php - Tập tin này sẽ chứa lớp Router.

Trước khi viết bộ định tuyến, chúng ta cần thiết kế API API (Cách sử dụng nó trong các ứng dụng). Dưới đây là API cho bộ định tuyến ra.

$ bộ định tuyến = Bộ định tuyến mới;
// Làm thế nào các yêu cầu GET sẽ được xác định
$ bộ định tuyến-> get ('/ some / route', function ($ request) {
    // Đối số $ request của cuộc gọi lại
    // sẽ chứa thông tin về yêu cầu
    trả lại "Nội dung";
});
// Làm thế nào các yêu cầu POST sẽ được xác định
$ bộ định tuyến-> bài đăng ('/ some / route', function ($ request) {
    // Cách lấy dữ liệu từ thân yêu cầu
    $ body = $ request-> getBody ();
});

Bây giờ chúng tôi đã xác định cách thức Bộ định tuyến của chúng tôi sẽ được sử dụng, hãy để cho tôi tạo ra nó.

Tạo lớp Yêu cầu.

Đầu tiên, xác định giao diện mà lớp Yêu cầu cụ thể sẽ thực hiện. Trong IRequest.php xác định giao diện IRequest.

getBody () lấy dữ liệu từ thân yêu cầu. Lớp Request phải có cách triển khai cho phương thức này.

Tạo lớp Yêu cầu.

Trong hàm tạo, gọi bootstrapSelf () - một phương thức đặt tất cả các khóa trong mảng $ _SERVER toàn cầu làm các thuộc tính của lớp Request và cũng gán các giá trị của chúng. Phương thức này thực hiện cuộc gọi đến phương thức toCamelCase ().

Phương thức toCamelCase () chuyển đổi một chuỗi từ vỏ rắn sang vỏ lạc đà.

getBody () là một triển khai của phương thức được xác định trong giao diện IRequest.

Tạo lớp Router.

Trong Router.php, thêm mã sau đây cho Bộ định tuyến.

Trong trình xây dựng lớp lớp Router, giữ một tham chiếu đến nó phụ thuộc của nó - đối tượng Request.

Hãy để sử dụng phương thức ma thuật PHP __call (). Phương thức này được kích hoạt khi gọi các phương thức không thể truy cập trong ngữ cảnh đối tượng.

Hãy xem xét các mẫu mã dưới đây.

Chúng tôi đang cố gắng gọi phương thức get () không được định nghĩa trong Bộ định tuyến lớp, vì vậy phương thức ma thuật __call () được kích hoạt. Nó nhận được hai đối số. Đối số đầu tiên là tên phương thức (‘get,) và đối số thứ hai là một mảng các đối số mà phương thức get () được gọi với i.e [‘ / hồi, hàm () {}].

Chúng tôi sử dụng phương thức ma thuật __call () để tự động tạo một mảng kết hợp ánh xạ các tuyến đường đến các cuộc gọi lại. Chúng tôi tạo một cho mỗi phương thức yêu cầu được hỗ trợ. Nếu một phương thức không hợp lệ được gọi trên đối tượng bộ định tuyến, chúng tôi sẽ trả lời bằng Phương thức 405 Không được phép.

Phương thức giải quyết () chọn một cuộc gọi lại được gọi để xử lý một yêu cầu dựa trên phương thức và đường dẫn HTTP HTTP yêu cầu (‘/,,‘ / foo / bar, v.v.).

Bây giờ chúng ta đã có bộ định tuyến của mình, hãy để sử dụng nó để tạo một ứng dụng.

Tạo một ứng dụng.

Trong index.php, nhập các lớp Request và Router mà chúng ta đã xác định, khởi tạo một bộ định tuyến và xác định một số tuyến.

Chạy và tự kiểm tra ứng dụng.

Hãy để sử dụng máy chủ phát triển PHP PHP để chạy ứng dụng trên cổng 8000.

Khi ở trong terminal, cd vào thư mục dự án và chạy lệnh sau.

$ php -S 127.0.0.1:8000

Mở trình duyệt web của bạn và điều hướng đến http: // localhost: 8000 / và http: // localhost: 8000 / hồ sơ để kiểm tra trang chủ và trang hồ sơ.

Sử dụng Postman hoặc curl (hoặc bất kỳ công cụ nào khác bạn chọn) để kiểm tra tuyến POST đến http: // localhost: 8000 / profile.

Đây là một ảnh chụp màn hình thử nghiệm của tôi bằng cách sử dụng postman.

POST / dữ liệu hoạt độngXÓA / dữ liệu trả về 405 Phương thức không được phép

Suy nghĩ cuối cùng.

PHP hiện có hỗ trợ kém cho các phương thức HTTP cho phép gửi dữ liệu trong phần thân yêu cầu, ngoài POST (tức là PUT, DELETE, PATCH, v.v.).

Bạn phải sử dụng php: // input (luồng đầu vào chỉ đọc) để đọc dữ liệu thô từ thân yêu cầu, sau đó phân tích dữ liệu thành một cặp giá trị khóa.

Bạn có cần thuê các nhà phát triển hàng đầu? Nói chuyện với Andela để giúp bạn với điều đó.