首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP AJAX 統一後端調度架構(cnblogs 版):反射機制實現動態路由完整代碼

     編輯:PHP 相關知識

來源

轉載自:ghypnus 的博客

架構圖解

前端 AJAX → Controller.php (反射調度) → 具體業務類 (LoginController 等)
     action=LoginController/login

三層代碼完整版

1. 前端 jQuery AJAX

$('#submit').on('click', function(e) {
    e.stopPropagation();
    $.ajax({
        url: '../../controllers/Controller.php',
        type: 'POST',
        dataType: 'text',
        data: {
            action: 'LoginController/login',
            username: username,
            password: password
        },
        timeout: 10000,
        error: function() { alert('服務器超時'); },
        success: function(data) { alert(data); }
    });
});

2. Controller.php 統一調度器

<?php
if (!empty($_REQUEST['action'])) {
    try {
        $action = explode('/', $_REQUEST['action']);
        $className = $action[0];
        $methodName = $action[1];

        require $className . '.php';
        $refClass = new ReflectionClass($className);

        if (class_exists($className) && $refClass->hasMethod($methodName)) {
            $method = $refClass->getMethod($methodName);
            $instance = $refClass->newInstance();
            $method->invokeArgs($instance, [$_REQUEST]);
            $result = $instance->getResult();
            echo $result;
        }
    } catch (Exception $exc) {
        echo $exc->getTraceAsString();
    }
}

3. LoginController.php 業務類

<?php
class LoginController {
    private $result;

    function __construct() {
        // 初始化數據庫連接等
    }

    function login($args) {
        // 具體登錄邏輯
        // $this->result = ...;
    }

    function getResult() {
        return $this->result;
    }
}

代碼審查與改進點

問題風險改進方案
直接 require 用戶輸入類名任意文件包含漏洞 (LFI/RFI)白名單驗證、basename 過濾、固定目錄掃描註冊
newInstance() 無參構造無法依賴注入、難以測試使用容器管理實例、或 newInstanceArgs 注入依賴
invokeArgs 直接傳 $_REQUEST參數污染、類型不安全、暴露內部結構DTO/Request 對象封裝、參數驗證、類型轉換
異常直接輸出堆疊信息信息洩露、用戶體驗差統一異常處理、友好錯誤碼、日誌記錄
getResult() 耦合返回格式業務類強綁定輸出格式調度器統一包裝響應、業務類返回純數據/異常

安全加固版調度器

<?php
// config/routes.php 返回允許的路由映射
$allowedRoutes = [
    'login' => ['class' => 'LoginController', 'method' => 'login'],
    'register' => ['class' => 'RegisterController', 'method' => 'register'],
    // ...
];

$action = $_REQUEST['action'] ?? '';
if (!isset($allowedRoutes[$action])) {
    http_response_code(404);
    exit(json_encode(['code' => 404, 'msg' => '接口不存在']));
}

$route = $allowedRoutes[$action];
$file = __DIR__ . '/controllers/' . $route['class'] . '.php';

if (!is_file($file)) {
    error_log("Controller file missing: {$route['class']}");
    exit(json_encode(['code' => 500, 'msg' => '服務器配置錯誤']));
}

require_once $file;

try {
    $ref = new ReflectionClass($route['class']);
    $method = $ref->getMethod($route['method']);
    $instance = $ref->newInstanceWithoutConstructor();
    
    // 參數綁定與驗證
    $params = [];
    foreach ($method->getParameters() as $param) {
        $name = $param->getName();
        $params[$name] = $_REQUEST[$name] ?? ($param->isDefaultValueAvailable() ? $param->getDefaultValue() : null);
    }
    
    $result = $method->invokeArgs($instance, [$params]);
    echo json_encode(['code' => 0, 'data' => $result]);
} catch (ValidationException $e) {
    echo json_encode(['code' => 400, 'msg' => $e->getMessage()]);
} catch (Exception $e) {
    error_log($e->getMessage());
    echo json_encode(['code' => 500, 'msg' => '服務器內部錯誤']);
}

適用場景與遷移建議

  • ✅ 適用:內部管理後台、快速原型、老系統最小化改造
  • ❌ 不適用:對外開放 API、高安全要求、團隊規模 > 5 人、長期維護項目
  • 🔄 遷移路徑:引入 FastRoute 做路由分發 → 依賴注入容器管理 Controller → 統一 Request/Response 對象 → 遷移至 Slim/Lumen/Laravel 微框架

此模式展示了 PHP 反射機制的強大靈活性,但「約定優於配置」若無約束極易失控。生產環境請務必加上白名單、參數驗證、異常處理三重保護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved