Hướng dẫn php url routing

routing system luôn là 1 phần quan trọng của hệ thống code website. Bài này sẽ hướng dẫn bạn tạo router riêng để không phụ thuộc framework.

2021-01-06 4003 lượt xem

  1. Trang Chủ
  2. [PHP CƠ BẢN] PHP CORE - Lập trình căn bản với php
  3. tạo router đơn giản trong php giống với framework

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng ebudezain

đọc dữ liệu hộ bố

hùng thông minh lắm

hùng đẹp trai

bài viết được viết bởi trương thanh hùng //ebudezain.com/

tôi thích vậy đó

ahihi đồ ngốc trương thanh hùng nè

Trong khi xây dựng backend cho 1 ứng dụng web, routing system luôn là 1 phần quan trọng của hệ thống code website. Tất cả các request khi qua Route đều được kiểm tra và xử lý. Sử dụng hệ thống định tuyến cho phép chúng ta cấu trúc ứng dụng của mình theo cách tốt hơn thay vì chỉ định mỗi yêu cầu vào một file hay folder như code core.

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

tôi thích vậy đó

hùng thông minh lắm

Bên cạnh đó đôi lúc chúng ta lại không cần 1 framework vì chúng quá nặng nề. Bài viết dưới đây mô tả cái nhìn tổng quan cũng như cách tạo ra 1 router nhanh mà không sử dụng framework hay package composer. 

  • Bạn cần chạy phiên bản PHP 5 trở lên trên máy phát triển của mình.
  • Kiến thức PHP cơ bản và hiểu 1 chút về lập trình hướng đối tượng. 

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng //ebudezain.com/

Bạn làm được gì thông qua bài này

hùng ebudezain

đọc dữ liệu hộ bố

đây là bài demo nên Router chỉ xử lý GET, POST. nếu bạn muốn nhiều hơn thì mình có comment code tiếng việt có dâu, bạn cứ xem và xử lý thêm

hùng thông minh lắm

hùng ebudezain

hùng đẹp trai

hùng thông minh lắm

hùng đẹp trai

hùng đẹp trai

bài viết được viết bởi trương thanh hùng //ebudezain.com/

vì nó rất đơn giản nên bạn sử dụng nó để lấy kiến thức nền xây dựng 1 framewok php cho riêng mình. 

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

hùng ebudezain

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

tôi thích vậy đó

bạn có thể sử dụng nó để làm máy chủ sản xuất nhưng hãy custom thêm nha. để nguyên như vậy là không ổn tí nào. mình muốn viết đơn giản để tất cả mọi ng đều hiểu được. 

đọc dữ liệu hộ bố

tôi thích vậy đó

ahihi đồ ngốc trương thanh hùng nè

Bắt đầu thôi !!! 

hùng thông minh lắm

hùng thông minh lắm

Dựng index file - đăng ký các router

ahihi đồ ngốc trương thanh hùng nè

tạo cấu trúc thư mục

ahihi đồ ngốc trương thanh hùng nè

ahihi đồ ngốc trương thanh hùng nè

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

hùng đẹp trai

hùng đẹp trai

tôi thích vậy đó

Cấu trúc thư mục tạo Router như sau 

hùng ebudezain

tôi thích vậy đó

hùng ebudezain

hùng thông minh lắm

ahihi đồ ngốc trương thanh hùng nè

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng thông minh lắm

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

tôi thích vậy đó

tôi thích vậy đó

đọc dữ liệu hộ bố

giải thích: 

  • index.php nên để trong folder public để tăng tính bảo mật giống như hầu hết các framework php khác.  
  • .htaccess nếu bạn có sử dụng apache thì bạn cũng từng phải bảo mật với file .htaccess. file này khi người dùng gõ vào folder trong public thì sẽ ngăn không cho hiện full các file tĩnh
  • Folder core rất quan trọng: 
  1. Request.php để xây dựng đối tượng request, mỗi 1 lần người dùng truy cập vào website sẽ tương ứng 1 request. và request đó sẽ mang param tương ứng. ta nên xây dựng 1 đối tượng request riêng. 
  2. Router.php là file định nghĩa cách thức hoạt động của Router, nhờ có file Router và sự kết hợp của requets chúng ta có thể tìm đúng Action tương ứng để chạy 

hùng thông minh lắm

tôi thích vậy đó

hùng thông minh lắm

tôi thích vậy đó

hùng thông minh lắm

khiến cho mọi request đều có chung 1 dạng định nghĩa

hùng thông minh lắm

tôi thích vậy đó

ahihi đồ ngốc trương thanh hùng nè

điều quan trọng nhất mà các framework làm là biến các code của website đều có cùng 1 dạng  từ domain.xyz/[thành-phần-sau-url] domain.xyz/index.php/[thành-phần-sau-url]. 

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

làm như vậy để làm gì? tất cả các code của 1 web php đều có chung 1 điểm bắt đầu và sẽ dễ xử lý hơn. 

tôi thích vậy đó

hùng đẹp trai

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

ahihi đồ ngốc trương thanh hùng nè

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

ahihi đồ ngốc trương thanh hùng nè

nếu bạn sử dụng apache làm server dĩ nhiên bạn cần file .htaccess để chuyển hướng tất cả url về dạng bạn muốn. Đây là file .htaccess[cái này của laravel mình copy thôi]: 

tôi thích vậy đó

hùng đẹp trai


    
        Options -MultiViews -Indexes
    

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} [.+]/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

tôi thích vậy đó

hùng thông minh lắm

nếu bạn sử dụng nginx để làm server thì bạn không cần file này, thay vào đó bạn chỉ cần nhớ config root trỏ vào:

hùng đẹp trai

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

tôi thích vậy đó

[Folder-code]/public

hùng đẹp trai

đọc dữ liệu hộ bố

hùng ebudezain

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

hùng thông minh lắm

đọc dữ liệu hộ bố

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

ví dụ nginx: 

server {

    listen       80;
    server_name  domain-cua-ban.com;
    root /var/www/SITE-PHP-ROUTER;

    location / {
        
        index  index.html index.htm;
    }
}

hùng đẹp trai

tôi thích vậy đó

ahihi đồ ngốc trương thanh hùng nè

bài viết được viết bởi trương thanh hùng //ebudezain.com/

tôi thích vậy đó

hùng ebudezain

Khi mọi code đều chạy vào file index.php đầu tiên thì chúng ta tha hồ "Khoe Cá Tính". 

hùng đẹp trai

ahihi đồ ngốc trương thanh hùng nè

tôi thích vậy đó

load tất cả các class từ folder core vào index.php

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng đẹp trai

hùng ebudezain

hùng thông minh lắm

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

tôi thích vậy đó

 để load tất cả các code vào ta dùng function load như sau : 

function coreAutoload[$class]
{
    $root = '../core/';
    $prefix = 'Core\\';
    // remove prefix

    $classWithoutPrefix = preg_replace['/^' . preg_quote[$prefix] . '/', '', $class];
    // Thay thế \ thành /
    $file = str_replace['\\', DIRECTORY_SEPARATOR, $classWithoutPrefix] . '.php';

    $path = $root . $file;
    if [file_exists[$path]] {
        require_once $path;
    }
}
spl_autoload_register['coreAutoload'];

hùng đẹp trai

hùng đẹp trai

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

hùng ebudezain

hùng đẹp trai

hùng ebudezain

Nếu bạn thấy ngứa mắt vì load bằng code như này bạn có thể thay bằng load composer.

hùng đẹp trai

ahihi đồ ngốc trương thanh hùng nè

hùng đẹp trai

Khởi tạo và đăng ký router trong index.php

hùng thông minh lắm

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

use Core\Request;
use Core\Router;
/// khởi tạo đối tượng router
$router = new Router[new Request];
// chú ý: trong đối tượng router hoàn toàn không có method get, post, put gì cả
/// nhưng ở đây mình vẫn gọi 1 method get => trong php nó sẽ chạy vào hàm __call 
$router->get['/', function [] {
    return "Hello world";
}];
/// tương tự khi gọi method post mà router không có method post nên sẽ chạy vào hàm __call
$router->post['/data', function [$request] {
    return json_encode[$request->getBody[]];
}];

hùng thông minh lắm

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng đẹp trai

hùng thông minh lắm

hùng đẹp trai

đọc dữ liệu hộ bố

hùng ebudezain

Bạn đã khởi tạo và đăng ký router xong và hết [ không làm gì nữa, thì php cũng sẽ tự đóng đối tượng lại bằng hàm __destruct.

hùng thông minh lắm

Vậy mình sẽ lợi dụng việc đóng đối tượng để viết 1 hàm trong Router, khi Đối tượng Router bị hủy nó sẽ chạy hàm __destruct trong class Router mình sẽ trình bày sau. Trước hết toàn bộ code file index.php sẽ như sau: 

Chủ Đề