在 php mvc 架构中,可通过路由映射将本地化 url(如 `/gebruiker/mijn-account`)透明转发到原始控制器(如 `usercontroller`),无需重命名控制器或修改业务逻辑,兼顾国际化体验与代码可维护性。
实现多语言 URL 的核心思路是分离“路由可见性”与“控制器真实名称”:URL 可以本地化(如荷兰语 /gebruiker/mijn-account),但后端仍统一调用 UserController::myAccount() 方法。关键在于在路由解析层建立语言别名映射,而非重构控制器类名。
✅ 推荐方案:路由级语言映射(推荐)
在路由分发器(如 Router.php 或框架的路由配置)中定义 URL 别名表:
// config/routes.php
return [
// 英文(默认)→ 保持原样
'user' => 'user',
'my-account' => 'my-account',
// 荷兰语映射 → 指向相同控制器/动作
'gebruiker' => 'user',
'mijn-account' => 'my-account',
];
然后在路由解析逻辑中进行标准化转换:
// Router.php(简化示例)
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pathParts = array_filter(explode('/', $uri));
// 加载映射表
$localeMap = require 'config/routes.php';
// 将路径段按映射转为标准标识符
$normalizedParts = [];
foreach ($pathParts as $part) {
$normalizedParts[] = $localeMap[$part] ?? $part;
}
// 现在 $normalizedParts = ['user', 'my-account'] → 安全调用 UserController
$controllerName = ucfirst($normalizedParts[0]) . 'Controller'; // UserController
$actionName = $normalizedParts[1] ?? 'index'; // myAccount → 注意驼峰转换(见下文)
⚠️ 注意事项: