PHP 怎么PHP Ant Design Pro

wen PHP项目 1

PHP 后端如何优雅集成 Ant Design Pro:从 RESTful API 到权限控制的完整实践

文章导读

PHP 怎么PHP Ant Design Pro

  • 为什么选择 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)在业务逻辑开发效率上非常高。

核心优势

  1. 成本低:PHP 虚拟主机遍地都是,前端构建后的静态文件可直接部署。
  2. 社区成熟:Laravel 的 Dingo API 或 ThinkPHP 的 多应用模式 能快速产出规范接口。
  3. 权限设计友好: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 数字,且 successtrue,如果字段名不匹配,请在 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 的快速部署和低成本优势,建议你在实际项目中从简到繁,先打通登录与列表页,再逐步实现复杂权限,多实践,多调试代理与跨域,这是新手最容易踩坑的地方。

抱歉,评论功能暂时关闭!