要用Symfony构建符合RESTful规范的接口,需从初始化骨架开始:用composer create-project symfony/skeleton创建最小项目,禁用--webapp;执行composer require api安装API Platform以自动配置序列化与CORS;先创建数据库再定义User实体并添加#[ApiResource]注解;运行迁移后启动服务器即可通过Swagger UI访问GET /api/users。

要用Symfony构建一个符合RESTful规范的接口,比如返回用户列表的GET /api/users,必须从项目初始化开始严格遵循其组件化路径,跳过Bundle自动注册或硬编码响应将导致序列化失效或CORS被拦截。
初始化Symfony API项目
运行composer create-project symfony/skeleton myapi创建最小骨架;不要用--webapp选项,它会引入Twig等非API必需组件,增加调试干扰。
执行composer require api安装API Platform核心包——这是官方推荐的RESTful层,它会自动启用symfony/serializer、symfony/http-foundation和nelmio/cors-bundle,省去手动配置序列化器与跨域头的步骤。
【必须执行php bin/console doctrine:database:create后再定义实体,否则后续make:entity会报错找不到数据库连接】
定义可暴露为API资源的数据模型
运行php bin/console make:entity User,依次添加name:string(255)、email:string(255)、createdAt:datetime_immutable字段。
在生成的src/Entity/User.php顶部use ApiPlatform\Metadata\ApiResource;,并在User类上方添加#[ApiResource]注解——这一步触发API Platform自动注册路由、序列化规则和OpenAPI文档入口。
运行php bin/console make:migration→php bin/console doctrine:migrations:migrate完成数据库表创建。
快速验证接口是否就绪
启动开发服务器:php -S 127.0.0.1:8000 -t public(确保public/index.php存在)。
直接访问http://127.0.0.1:8000/api,页面自动跳转至Swagger UI;这里能看到GET /api/users端点,点击“Try it out”即可发起请求。
若返回{"hydra:member":[],"hydra:totalItems":0},说明资源已成功暴露且无数据——这是正常初始状态,不是错误。
自定义控制器响应逻辑(非CRUD场景)
方法一:覆盖默认操作
在#[ApiResource]中指定operations,例如:#[ApiResource(operations: [new GetCollection(identifier: 'custom_users')])],然后创建对应控制器方法并标注#[Route('/api/custom-users', name: 'custom_users', methods: ['GET'])]。
方法二:禁用默认操作+手写JSON响应#[ApiResource(operations: [])] → 在控制器中注入SerializerInterface,调用$serializer->serialize($data, 'json') → 返回new Response($json, 200, ['Content-Type' => 'application/json'])。
【禁用ApiResource后务必手动设置Content-Type: application/json,否则前端fetch()可能因MIME类型不匹配而拒绝解析】


















