Symfony作为主流的PHP框架,路由是其处理请求的核心组件之一,负责将用户请求的URL映射到对应的控制器方法。很多开发者刚开始使用Symfony时,对路由的配置方式和参数传递规则不太熟悉,下面我们就来详细讲解相关内容。

Symfony路由的几种配置方式
Symfony支持多种路由配置方式,开发者可以根据项目习惯选择使用。
1. 注解方式配置路由
注解方式是在控制器方法上直接添加路由注解,这种方式比较直观,适合小型项目或者习惯注解开发的场景。首先需要确保项目中安装了注解依赖,然后在控制器中引入对应的注解类。
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class DemoController extends AbstractController
{
/**
* @Route("/demo", name="demo_index")
*/
public function index()
{
return $this->json(['msg' => '这是demo首页']);
}
}2. YAML方式配置路由
YAML配置是Symfony默认推荐的配置方式,路由规则统一放在config/routes.yaml文件中,便于统一管理和维护。
# config/routes.yaml
demo_index:
path: /demo
controller: App\Controller\DemoController::index3. XML方式配置路由
XML配置方式适合需要严格格式校验的项目,路由规则放在config/routes.xml文件中。
<?xml version="1.0" encoding="UTF-8"?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd">
<route id="demo_index" path="/demo" controller="App\Controller\DemoController::index" />
</routes>路由参数定义与传递
实际开发中经常需要在URL中传递参数,Symfony路由支持必选参数、可选参数以及参数校验。
必选参数配置
必选参数需要在路由路径中用{参数名}包裹,请求时必须传递对应参数,否则无法匹配到该路由。
/**
* @Route("/demo/detail/{id}", name="demo_detail")
*/
public function detail($id)
{
return $this->json(['detail_id' => $id]);
}如果使用YAML配置必选参数,写法如下:
demo_detail:
path: /demo/detail/{id}
controller: App\Controller\DemoController::detail可选参数配置
可选参数可以在参数名后面加?,同时可以给参数设置默认值,请求时不传递该参数也能匹配路由。
/**
* @Route("/demo/list/{page?1}", name="demo_list")
*/
public function list($page)
{
return $this->json(['current_page' => $page]);
}参数校验规则
可以通过正则表达式限制参数的格式,比如限制id只能是数字,避免无效请求。
/**
* @Route("/demo/detail/{id<\d+>}", name="demo_detail")
*/
public function detail($id)
{
return $this->json(['detail_id' => $id]);
}控制器中获取路由参数
除了直接在控制器方法参数中接收路由参数,还可以通过Request对象获取,适合需要获取多个参数的场景。
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class DemoController extends AbstractController
{
/**
* @Route("/demo/info/{id}", name="demo_info")
*/
public function info(Request $request, $id)
{
// 方法参数直接获取
$param1 = $id;
// 通过Request对象获取
$param2 = $request->attributes->get('id');
return $this->json([
'param1' => $param1,
'param2' => $param2
]);
}
}常见问题说明
配置路由时需要注意路由的优先级,YAML配置中写在上面的路由会优先匹配。如果路由路径有重叠,需要把更具体的路由放在前面,避免被通用路由覆盖。另外,路由名称需要保持唯一,否则会出现路由冲突的问题。如果需要传递多个参数,只需要在路径中按顺序添加多个{参数名}即可,控制器方法参数顺序要和路由参数顺序一致。