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

PHP + AJAX 統一後端調度架構:反射機制實現動態控制器路由

     編輯:PHP 相關知識

架構設計目標

前端統一入口調用後端任意類方法,避免為每個功能寫單獨路由文件,實現「前端傳類名+方法名,後端動態實例化調用」的解耦架構。

三層架構圖解

┌─────────────┐     ┌──────────────────┐     ┌──────────────────┐
│  前端 JS    │────▶│  Controller.php  │────▶│ 具體業務類        │
│  (AJAX)     │     │  (統一調度中心)   │     │  (LoginController等)│
└─────────────┘     └──────────────────┘     └──────────────────┘
      action=                        反射實例化              具體邏輯實現
ClassName/method

核心代碼實現

1. 前端 AJAX 請求

$('#submit').on('click', function(e) {
    e.stopPropagation();
    $.ajax({
        url: '../../controllers/Controller.php',
        type: 'POST',
        dataType: 'json',
        data: {
            action: 'LoginController/login', // 格式:類名/方法名
            username: $('#user').val(),
            password: $('#pass').val()
        },
        success: function(res) {
            if (res.code === 0) alert(res.msg);
            else console.error(res.msg);
        }
    });
});

2. 統一調度器 Controller.php

<?php
header('Content-Type: application/json');

if (empty($_REQUEST['action'])) exit(json_encode(['code' => -1, 'msg' => '缺少 action 參數']));

try {
    // 解析類名與方法
    list($class, $method) = explode('/', $_REQUEST['action'], 2);
    $file = __DIR__ . '/' . $class . '.php';

    if (!is_file($file)) throw new Exception("類文件不存在: $class");

    require_once $file;

    if (!class_exists($class)) throw new Exception("類未定義: $class");

    $ref = new ReflectionClass($class);
    if (!$ref->hasMethod($method)) throw new Exception("方法不存在: $method");

    $methodRef = $ref->getMethod($method);
    if (!$methodRef->isPublic()) throw new Exception("方法非公共: $method");

    $instance = $ref->newInstanceWithoutConstructor(); // 不自動調用構造函數
    // 或 newInstanceArgs($_REQUEST) 自動注入參數

    // 調用並捕獲返回值
    $result = $methodRef->invokeArgs($instance, [$_REQUEST]);

    echo json_encode(['code' => 0, 'data' => $result]);
} catch (Exception $e) {
    // 生產環境記錄日誌,不暴露堆疊信息
    error_log($e->getMessage());
    echo json_encode(['code' => -1, 'msg' => '服務器內部錯誤']);
}

3. 業務類規範 LoginController.php

<?php
class LoginController {
    private $result = [];

    public function login($params) {
        // 1. 參數驗證
        if (empty($params['username']) || empty($params['password'])) {
            $this->result = ['code' => 1, 'msg' => '用戶名密碼不能為空'];
            return;
        }

        // 2. 業務邏輯(示例)
        $user = User::findByUsername($params['username']);
        if (!$user || !password_verify($params['password'], $user->password_hash)) {
            $this->result = ['code' => 2, 'msg' => '帳號或密碼錯誤'];
            return;
        }

        // 3. 設置 Session / JWT
        $_SESSION['user_id'] = $user->id;
        $this->result = ['code' => 0, 'msg' => '登錄成功', 'token' => generateJWT($user)];
    }

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

安全與擴展建議

  • 白名單機制:在調度器中維護允許調用的類/方法列表,防止任意代碼執行
  • 參數綁定:使用 ReflectionParameter 解析方法簽名,自動類型轉換與驗證
  • 統一響應格式:強制業務類返回標準結構 ['code', 'msg', 'data']
  • 權限攔截:在調度器中集成 RBAC 檢查,$methodRef->getAttributes() 讀取註解權限
  • 異常處理:自定義業務異常類,調度器捕獲後映射為友好錯誤碼

適用場景

  • 中小型項目快速開發,減少路由配置工作量
  • 老系統重構,逐步遷移至規範 MVC 框架
  • 內部管理後台、API 聚合網關等內部系統

注意:生產環境核心業務建議遷移至成熟框架(Laravel/Symfony/ThinkPHP),利用其路由、中間件、依賴注入等完善機制保障安全與可維護性。

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