PHP路由技術的原理與實踐

0x00 路由實現原理

用戶經過指定的URL範式對後臺進行訪問,URL路由處理類進行處理後,轉發到邏輯處理類,邏輯處理類將請求結果返回給用戶。php

約定URL範式和規則

約定一套本身喜歡的,對搜索引擎友好,對用戶友好的URL規則框架

URL處理類

對用戶請求的URL進行解析處理,獲取到用戶請求的類,方法,以及Query參數等,並將請求轉發給邏輯處理類。網站

邏輯處理類

處理網站的真實業務邏輯。搜索引擎

0x01 URL範式約定

目前來講,有兩種比較流行的URL格式,一種是普通模式,一種是 pathinfo 模式。code

普通模式

ThinkPHP 框架中,默認的URL格式即爲普通模式,普通模式URL以下:blog

index.php?m=home&c=user&a=login&v=value

其中 m 參數的值爲模塊名稱, c 參數的值爲控制器名稱, a 參數的值爲方法名稱,以後的參數則爲該方法中所要接收的其餘 GET 請求參數索引

pathinfo模式

CodeIgniter 框架中,默認的URL格式爲 pathinfo 模式,以下:路由

index.php/controller/method/prarme1/value1

這塊的意義也已經標註的很明白了,在 method 之後,就是方法接收的 GET 參數了,格式就是 名稱/值 開發

0x02 URL路由處理類(核心)

此處咱們選用最簡單的普通單模塊模式進行演示,只爲說明簡單的原理,以下:get

index.php?c=user&a=login&v=value

咱們約定參數 c 爲控制器名稱,參數 a 爲方法名稱,以後的均是 GET 參數

<?php
include 'index.class.php';
include 'user.class.php';
// 對用戶請求URL進行處理
$query = $_GET;
$controller = isset($query['c']) ? $query['c'] : 'indexController';
$action = isset($query['a']) ? $query['a'] : 'index';
if (class_exists($controller)) {
    if (method_exists($controller, $action)) {

        unset($_GET['c']);
        unset($_GET['a']);
        // 實例化用戶請求類並調用方法
        (new $controller())->$action();

    } else {
        echo '控制器' . $controller . '中不存在方法' . $action;
    }
} else {
    echo '不存在控制器' . $controller;
}

其中 unset() 掉兩個get參數,只是爲了對真正調用的方法形成其餘影響。

0x03 邏輯處理類

邏輯處理類就是最終的業務邏輯,也就是真正的迴應用戶請求的代碼片斷。下面只是一個簡單的示例:

/* index.class.php 文件源碼 */
<?php
class indexController {

    public function index(){
        var_dump($_GET);
    }
}
/* user.class.php 文件源碼 */
<?php
class user {

    public function index() {
        echo '這裏是User控制器';
    }

    public function login() {
        var_dump($_GET);
    }
}

0x04 結束

這裏只是最簡單的PHP路由技術的原理,其實真正爲一個項目或者框架進行路由開發,可能須要可以兼容不少複雜的狀況,須要對各類狀況都要考慮到。

原文做者:我纔是二亮
原文連接:http://www.2liang.me/?p=230轉載必須在正文中標註並保留原文連接、做者等信息。

相關文章
相關標籤/搜索