PHP 后端如何优雅集成 Ant Design Pro:从 RESTful API 到权限控制的完整实践
文章导读
- 为什么选择 PHP + Ant Design Pro 组合? —— 解析技术选型背后的生态逻辑与真实适用场景。
- 环境搭建与项目初始化 —— 手把手教你在本地快速启动 Ant Design Pro 前端,并配置 PHP 后端(Laravel / ThinkPHP)的跨域与代理。
- 前后端数据对接:从 Mock 到真实 API —— 如何用 PHP 生成标准 RESTful 接口,并让 Ant Design Pro 的
request.ts无缝切换。- 权限控制的终极方案:JWT + 动态路由 —— 讲解如何在 PHP 中签发与校验 Token,并联动前端的
Access组件实现菜单级权限。- 常见问题问答(FAQ) —— 针对“接口返回格式不对”“上传文件失败”“刷新页面404”等高频痛点给出解决方案。
为什么选择 PHP + Ant Design Pro 组合?
很多开发者误以为 Ant Design Pro 只能搭配 Java 或 Node.js,PHP 在中小型系统、CMS 和快速迭代项目中依然占据半壁江山,Ant Design Pro 提供了开箱即用的后台管理界面(如用户管理、Dashboard、异常页),而 PHP(尤其是 Laravel 或 Hyperf)在业务逻辑开发效率上非常高。
核心优势:
- 成本低:PHP 虚拟主机遍地都是,前端构建后的静态文件可直接部署。
- 社区成熟:Laravel 的
Dingo API或 ThinkPHP 的多应用模式能快速产出规范接口。 - 权限设计友好:Ant Design Pro 的
ProLayout支持根据后端返回的路由表动态渲染菜单,恰好匹配 PHP 后端“查表分配权限”的常规做法。
环境搭建与项目初始化
前端步骤(假设你已经安装 Node.js 14+):
# 使用 yarn 或 npm 创建项目 yarn create umi my-admin cd my-admin yarn yarn start
后端步骤(以 Laravel 8 为例):
composer create-project laravel/laravel php-backend php artisan serve --port=8000
关键配置 - 跨域与代理:
Ant Design Pro 默认开发端口是 8000,后端是 8000,但前端代理需要转发 /api 到 PHP 服务,修改 config/proxy.ts:
export default {
'/api': {
target: 'http://127.0.0.1:8000',
changeOrigin: true,
pathRewrite: { '^/api': '' },
},
};
PHP 端处理 CORS(Laravel 中间件):
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}
前后端数据对接:从 Mock 到真实 API
Ant Design Pro 默认使用 src/services/ 下的 TypeScript 文件管理请求,你需要替换掉 Mock 数据,以“用户列表”为例:
定义 PHP 路由(routes/api.php):
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
设置响应格式(Ant Design Pro 期望的标准结构):
{
"data": [{"id": 1, "name": "张三"}],
"total": 100,
"success": true
}
在 PHP 控制器中:
public function index(Request $request)
{
$list = User::paginate($request->input('pageSize', 10))->toArray();
return response()->json([
'data' => $list['data'],
'total' => $list['total'],
'success' => true,
]);
}
修改前端服务(src/services/user.ts):
export async function queryUsers(params) {
return request('/api/users', { params });
}
注意:去掉 /api 前缀是错误的,因为代理规则已经处理,实际开发中直接使用 /api/users 即可。
权限控制的终极方案:JWT + 动态路由
这是 PHP 集成 Ant Design Pro 最核心的一环。Ant Design Pro 的 Access 组件可以依据当前用户角色控制按钮显示,但菜单权限需要后端返回路由配置。
后端生成 JWT(使用 firebase/php-jwt):
composer require firebase/php-jwt
登录接口示例:
use Firebase\JWT\JWT;
public function login(Request $request)
{
$user = User::where('name', $request->input('username'))->first();
if ($user && password_verify($request->input('password'), $user->password)) {
$payload = [
'uid' => $user->id,
'iat' => time(),
'exp' => time() + 7200,
];
$token = JWT::encode($payload, env('JWT_SECRET'), 'HS256');
return response()->json([
'success' => true,
'data' => ['token' => $token, 'name' => $user->name],
]);
}
return response()->json(['success' => false, 'errorMessage' => '账号或密码错误']);
}
前端获取用户信息和权限(src/services/user.ts):
// 获取当前用户(携带 token 请求)
export async function currentUser() {
return request('/api/me', {
method: 'GET',
headers: { Authorization: `Bearer ${localStorage.getItem('token')}` },
});
}
PHP 返回动态路由表(关键):
public function me(Request $request)
{
$routes = [
['path' => '/dashboard', 'name' => '仪表盘', 'component' => './Dashboard'],
['path' => '/system', 'name' => '系统管理', 'routes' => [
['path' => '/system/user', 'name' => '用户管理', 'component' => './System/User'],
]],
];
return response()->json(['data' => $routes, 'success' => true]);
}
前端动态渲染(在 src/app.tsx 中):
const fetchUserInfo = async () => {
const { data } = await getCurrentUser();
return data;
};
const layout = {
menuDataRender: (menuData) => {
// 这里直接使用后端返回的路由表,替换默认菜单
return fetchRoutes().then(res => res.data);
},
};
常见问题问答(FAQ)
Q1:请求接口时返回 401,但 POST 请求没问题?
A:检查 PHP 的 VerifyCsrfToken 中间件,Laravel 对 API 路由默认关闭 CSRF 验证,但如果你在 routes/web.php 里写了接口,需要移除该中间件,注意 Authorization Header 名称必须完全一致(大小写敏感)。
Q2:Ant Design Pro 的 request 拿到数据后为何表格不显示?
A:检查 request 的泛型参数,后端返回必须包含 data 数组和 total 数字,且 success 为 true,如果字段名不匹配,请在 config/defaultSettings.ts 中配置 requestConfig.dataField 或者直接修改后端返回值。
Q3:图片上传到 PHP 时,前端 <Upload> 组件如何对接?
A:Ant Design Pro 的 Upload 默认使用 action 设置为上传接口,PHP 端需接收文件并返回 URL:
public function upload(Request $request)
{
$file = $request->file('file');
$path = $file->store('public/uploads');
$url = asset('storage/' . str_replace('public/', '', $path));
return response()->json(['url' => $url]);
}
Q4:刷新页面后 404(部署到 Nginx 时)?
A:需要配置 Nginx 的 try_files,将所有路由指向 index.html:
location / {
try_files $uri $uri/ /index.html;
}
Q5:PHP 如何跟 Ant Design Pro 的动态路由做权限锚点?
A:不要在前端写死路由权限,后端返回路由表时,每个路由增加 access 字段(如 ['admin']),前端在 menuDataRender 中过滤该数组即可。
最后总结:Philippe 和 Ant Design Pro 的组合并非“土洋结合”,而是注重开发效率与生态互补的务实之选,重点在于统一 API 格式、规范 JWT 流程、动态渲染菜单,这样既能享受 React 生态的现代前端体验,又能利用 PHP 的快速部署和低成本优势,建议你在实际项目中从简到繁,先打通登录与列表页,再逐步实现复杂权限,多实践,多调试代理与跨域,这是新手最容易踩坑的地方。
