在 symfony 5.4 中创建控制器是构建 web 应用的第一步,不创建控制器所有请求都会返回 404;可通过命令行 php bin/console make:controller usercontroller 快速生成,或手动在 src/controller/ 下创建符合命名规范、继承 abstractcontroller 并正确 use 相关类的 php 文件。

在 Symfony 5.4 中创建控制器是构建 Web 应用的第一步,它直接决定路由能否被响应、业务逻辑能否被触发、数据能否流向视图——不创建控制器,【所有请求都会返回 404】,哪怕模板和路由配置都正确。
手动创建控制器类文件
第一步:在 src/Controller/ 目录下新建 PHP 文件,例如 UserController.php。
第二步:按命名规范写类名——必须以 Controller 结尾,且首字母大写;文件名与类名严格一致(UserController.php → class UserController)。
第三步:继承 AbstractController,这是 Symfony 5.4 推荐的基类,自带常用工具方法(如 render()、redirectToRoute()),比直接实现 ControllerInterface 更安全省事。
第四步:添加 use 语句:use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 和 use Symfony\Component\HttpFoundation\Response;——漏掉前者会导致 render() 报错,漏掉后者则无法显式返回 Response 实例。
用命令行快速生成控制器
执行:php bin/console make:controller UserController。
该命令会自动完成四件事:创建 src/Controller/UserController.php、生成带 @Route 注解的 index 方法、在 templates/user/ 下建好空的 index.html.twig、并把路由指向 /user。
生成的控制器默认带一个 index() 方法,返回 render('user/index.html.twig')——这一步不能跳过,否则访问 /user 会报 Template not found 错误。
注意:如果项目没装 symfony/maker-bundle,命令会失败。先运行 composer require --dev symfony/maker-bundle 再重试。
定义路由的三种方式
方法一:注解路由(最常用)
在控制器方法上方加 @Route("/admin/users", name="admin_user_list"),需提前 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;(Symfony 5.4 默认启用,无需额外配置)。
方法二:PHP 属性路由(Symfony 5.4+ 原生支持)
用 PHP 8+ 属性替代注解:#[Route('/api/posts', name: 'api_post_list')],更轻量、无依赖、IDE 支持更好。
方法三:配置文件路由
在 config/routes.yaml 中写:blog_list: path: /blog controller: App\Controller\BlogController::index
这种方式适合集中管理第三方 Bundle 的路由,或需要统一前缀时(比如全部加 /admin 前缀)。
让控制器响应 JSON 请求
第一步:在方法签名中声明返回类型为 JsonResponse,并 use Symfony\Component\HttpFoundation\JsonResponse;。
第二步:用 return $this->json(['status' => 'ok', 'data' => $users]); 替代 render() ——【不要用 new JsonResponse() 手动构造,容易漏设 Content-Type 头】。
第三步:若需处理 POST JSON 数据,用 $request->getContent() 读原始体,再 json_decode($content, true) 解析——$request->request->all() 只对 application/x-www-form-urlencoded 有效,对 application/json 无效。











