全书目录

第三十七篇:Symfony 完全指南 —— 组件化政务城区宇宙

第七章:Routing + Controller,就是“门牌系统 + 受理窗口”

1 分钟 429 字 第 704 / 962 个阅读单元

在 Symfony 里,路由不只是“URL 映射”。

它更像政务城区里的:

text
门牌系统
+ 分诊台
+ 办事入口规则

当前主流写法,是直接用 PHP Attributes 把门牌挂在窗口旁边:

php
<?php

namespace App\Controller;

use App\Entity\BusinessPermit;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

final class PermitController extends AbstractController
{
    #[Route('/permits/{id}', name: 'permit_show', methods: ['GET'])]
    public function show(BusinessPermit $permit): Response
    {
        return $this->render('permit/show.html.twig', [
            'permit' => $permit,
        ]);
    }

    #[Route('/api/permits/{id}', name: 'api_permit_show', methods: ['GET'])]
    public function showApi(BusinessPermit $permit): Response
    {
        return $this->json([
            'id' => $permit->getId(),
            'businessName' => $permit->getBusinessName(),
            'status' => $permit->getStatus(),
        ]);
    }
}

这里发生了几件非常 Symfony 的事:

  • #[Route(...)] 直接把门牌和窗口挂在一起
  • AbstractController 给你常用快捷方法,比如 render()json()redirectToRoute()
  • BusinessPermit $permit 这种参数,不是魔法,是 Entity Value Resolver 帮你按路由参数自动查实体
  • 同一座城区,可以直接出 HTML,也可以直接出 JSON

这就是它的“政务感”:

text
同一套受理机制
既能接待人类办事
也能接待系统办事

但要记住一个极重要原则:

Controller 是窗口,不是整个政府。

窗口负责:

  • 接请求
  • 收参数
  • 调服务
  • 决定返回什么

窗口不该负责:

  • 所有业务决策
  • 所有数据库细节
  • 所有异步逻辑
  • 所有权限规则
  • 所有通知发送

Controller 应该薄,最好薄到像胶水层。