Hướng dẫn php routes example - ví dụ về tuyến đường php

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 4579 lượt xem 4579 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 https://ebudezain.com/

tôi thích vậy đó

hùng đẹp trai

hùng đẹp trai

hùng đẹp trai

hùng ebudezain

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

hùng ebudezain

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

tôi thích vậy đó

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

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

tôi thích vậy đó

hùng đẹp trai

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

tôi thích vậy đó

hùng ebudezain

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

tôi thích vậy đó

tôi thích vậy đó

hùng đẹp trai

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.

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.

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

tôi thích vậy đó

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

hùng đẹp trai

tôi thích vậy đó

hùng ebudezain

hùng đẹp trai

hùng ebudezain

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

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 thông minh lắm

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

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

hùng ebudezain

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

tôi thích vậy đó

hùng đẹp trai

hùng đẹp trai

hùng ebudezain

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

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

tôi thích vậy đó

hùng đẹp trai

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

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

tôi thích vậy đó

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

Hướng dẫn php routes example - ví dụ về tuyến đường php

hùng ebudezain

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.

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.

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.  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.  
  • 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. .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
  • Kiến thức PHP cơ bản và hiểu 1 chút về lập trình hướng đối tượng. 
  1. Bạn làm được gì thông qua bài này để 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. đâ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 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 

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

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

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

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.

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

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

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

tôi thích vậy đó

tôi thích vậy đó

hùng ebudezain

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nèindex.php/[thành-phần-sau-url]. 

tôi thích vậy đó

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

hùng ebudezain

tôi thích vậy đó

hùng ebudezain

hùng ebudezain

hùng ebudezain

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.

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 ebudezain

hùng ebudezain

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

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

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

hùng đẹp trai

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 đó

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

hùng thông minh lắm

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


    
        Options -MultiViews -Indexes
    

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP: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]

hùng đẹp trai

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

tôi thích vậy đó

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

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

[Folder-code]/public

tôi thích vậy đó

tôi thích vậy đó

hùng thông minh lắm

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

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 ebudezain

server {

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

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

tôi thích vậy đó

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

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 ebudezain

hùng đẹp trai

tôi thích vậy đó

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

hùng đẹp trai

hùng thông minh lắm

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

tôi thích vậy đó

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 https://ebudezain.com/

hùng thông minh lắm

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');

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

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

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

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

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

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

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

hùng đẹp trai

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): 

hùng đẹp trai

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:

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

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

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

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 https://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());
});

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

hùng thông minh lắm

hùng đẹp trai

tôi thích vậy đó

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

hùng thông minh lắm

 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());
});

/// tương tự __call
$router->get('/profile/hung', function ($request) {
    
    return "profile profile";
});

//// kết thúc hoàn toàn quá trình
/// tại đây hàm __destruct được gọi, vì hàm hủy được chạy khi hệ thống chương trình hủy 1 đối tượng
/// lúc này là lúc ta thực thi code cần thiết theo từng router

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

hùng đẹp trai

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): 

hùng đẹp trai

hùng đẹp trai

hùng thông minh lắm

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

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:

bootstrapSelf();
    }
    
    /**
     * bootstrapSelf là hàm lấy tất cả param của $_SERVER đổ vào cho đối tượng gốc.
     * sau này việc sử dụng 1 router sẽ không cần sử dụng biến global của PHP
     * thay vào đó chúng ta sẽ truyền đối tượng request vào
     * các key của biến $_SERVER sẽ được format theo dạng CamelCase 
     * đây là cú pháp lạc đà
     *
     * @return void
     */
    private function bootstrapSelf()
    {
        foreach ($_SERVER as $key => $value) {

            $this->{$this->toCamelCase($key)} = $value;
        }
    }
    
    /**
     * toCamelCase hàm này để format string bình thường thành cấu trúc lạc đà
     *
     * @param  mixed $string type dạng lạc đà 
     * @return void
     */
    private function toCamelCase($string)
    {
        $result = strtolower($string);

        preg_match_all('/_[a-z]/', $result, $matches);

        foreach ($matches[0] as $match) {

            $c      = str_replace('_', '', strtoupper($match));
            $result = str_replace($match, $c, $result);
        }

        return $result;
    }
    
    /**
     * getBody 
     * hàm này không có giá trị trả ra khi phương thức là GET
     * Bạn có thể handle thêm ở đây khi bạn cần các phương thức khác như PUT, PATCH, DELETE,...
     *
     * @return void $body được trả ra để trong Closure function handle chính sẽ gọi đến
     */
    public function getBody()
    {
        if ($this->requestMethod === Request::GET_METHOD ) {
            return;
        }

        if ($this->requestMethod == Request::POST_METHOD ) {

            $body = array();
            foreach ($_POST as $key => $value) {

                $body[$key] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_SPECIAL_CHARS);
            }

            return $body;
        }
    }
}

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

hùng ebudezain

request = $request;
    }

    function __call($name, $args)
    {
        list($route, $method) = $args;

        /// kiểm tra phương thức có được support không ? 
        /// hiện tại chỉ có GET và POST
        if (!in_array(strtoupper($name), $this->supportedHttpMethods)) {

            /// nếu phương thức chưa được hộ trợ thì return 405 header
            $this->invalidMethodHandler();
        }

        //// nạp Closure function vào router
        /// get:array(1)
        /// "/" : Closure
        $this->{strtolower($name)}[$this->formatRoute($route)] = $method;
    }

    /**
     * Removes trailing forward slashes from the right of the route.
     * @param route (string)
     */
    private function formatRoute($route)
    {
        $result = rtrim($route, '/');
        if ($result === '') {
            return '/';
        }
        return $result;
    }

    private function invalidMethodHandler()
    {
        header("{$this->request->serverProtocol} 405 Method Not Allowed");
    }

    private function defaultRequestHandler()
    {
        header("{$this->request->serverProtocol} 404 Not Found");
    }

    /**
     * Resolves a route
     * là hàm xử lý chính cho router trước khi hàm __destruct success
     * hàm này sẽ gọi function được declare trong file router để chạy nội dung
     */
    function resolve()
    {
        $methodDictionary = $this->{strtolower($this->request->requestMethod)};
        $formatedRoute    = $this->formatRoute($this->request->requestUri);
        $method           = isset($methodDictionary[$formatedRoute])? $methodDictionary[$formatedRoute] : null;

        if (is_null($method)) {

            /// nếu không tìm thấy route nào phù hợp thì sẽ trả ra header 404
            $this->defaultRequestHandler();
            return;
        }
        
        /// hàm thần thánh để thực thi code của function Closure trong file index.php
        echo call_user_func_array($method, array($this->request));
    }

    function __destruct()
    {
        $this->resolve();
    }
}

hùng đẹp trai

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

hùng đẹp trai

hùng thông minh lắm

hùng thông minh lắm

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

tôi thích vậy đó

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

hùng thông minh lắm

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 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 thông minh lắm

hùng đẹp trai

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

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

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:

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

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

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

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:

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

tôi thích vậy đó

tôi thích vậy đó

hùng thông minh lắm

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

tôi thích vậy đó

Hướng dẫn php routes example - ví dụ về tuyến đường php

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

hùng đẹp trai

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

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

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

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 ebudezain

tôi thích vậy đó

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

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

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

tôi thích vậy đó

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

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

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

tôi thích vậy đó

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

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

tôi thích vậy đó

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