前端統一入口調用後端任意類方法,避免為每個功能寫單獨路由文件,實現「前端傳類名+方法名,後端動態實例化調用」的解耦架構。
┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 前端 JS │────▶│ Controller.php │────▶│ 具體業務類 │
│ (AJAX) │ │ (統一調度中心) │ │ (LoginController等)│
└─────────────┘ └──────────────────┘ └──────────────────┘
action= 反射實例化 具體邏輯實現
ClassName/method
$('#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);
}
});
});
<?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' => '服務器內部錯誤']);
}
<?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']$methodRef->getAttributes() 讀取註解權限注意:生產環境核心業務建議遷移至成熟框架(Laravel/Symfony/ThinkPHP),利用其路由、中間件、依賴注入等完善機制保障安全與可維護性。