在 Symfony 里,路由不只是“URL 映射”。
它更像政务城区里的:
门牌系统
+ 分诊台
+ 办事入口规则当前主流写法,是直接用 PHP Attributes 把门牌挂在窗口旁边:
<?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
这就是它的“政务感”:
同一套受理机制
既能接待人类办事
也能接待系统办事但要记住一个极重要原则:
Controller 是窗口,不是整个政府。
窗口负责:
- 接请求
- 收参数
- 调服务
- 决定返回什么
窗口不该负责:
- 所有业务决策
- 所有数据库细节
- 所有异步逻辑
- 所有权限规则
- 所有通知发送
Controller 应该薄,最好薄到像胶水层。