ChainRouter

3.3 version
维护中的版本

协力文档 symfonychina感谢Yedrops的奉献。

Symfony CMF Routing组件的核心是 ChainRouter。它用于替代Symfony的默认路由系统。

ChainRouter 的工作策略是通过接受一组优先级的路由,RouterInterface 实现,通常称为“路由器”。

处理传入请求时,ChainRouter 根据其配置的优先级对配置的路由器进行迭代,直到其中一个能够 match(匹配)请求或匹配URL并提供请求参数。

一直以来,路由就不得不单独地去匹配URL中的字符串。从Symfony 2.2起,它可选地实现了 RequestMatcherInterface 接口,如果路由希望使用请求中的其他信息比如domain或accept-encoding,它可以对完整的 Request 对象进行匹配。 ChainRouter 支持这两种路由匹配。

添加路由到链上 

使用 ChainRouteradd 方法添加路由,使用此方法添加默认Symfony路由:

1
2
3
4
5
6
use Symfony\Component\Routing\Router;
use Symfony\Cmf\Component\Routing\ChainRouter;
 
$chainRouter = new ChainRouter();
$chainRouter->add(new Router(...));
$chainRouter->match('/foo/bar');

现在,当 ChainRouter 匹配请求时,它将要求Symfony(的)路由(表)查看请求是否匹配。如果没有匹配,它将抛出ResourceNotFoundException

如果添加一个新的路由器,例如 DynamicRouter,它将在Symfony路由器之后被调用(因为它是最先添加的)。要控制顺序,可以使用 add 方法的第二个参数设置优先级。较高的优先级首先排序。

1
2
3
4
5
6
7
8
use Symfony\Cmf\Component\Routing\DynamicRouter;
// ...
 
$chainRouter->add(new Router(...), 1);
 
$dynamicRouter = new DynamicRouter(...);
// ...
$chainRouter->add($dynamicRouter, 100);

你将在本文后面了解如何实例化 DynamicRouter

注册路由的Compiler Pass 

此组件提供了一个 RegisterRoutersPass。如果使用Symfony Dependency Injection(依赖注入)组件,你可以使用此编译器传递来注册具有特定标记的所有路由器:

1
2
3
4
5
6
7
8
use Symfony\Cmf\Component\Routing\DependencyInjection\Compiler\RegisterRoutersPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
 
// a ContainerBuilder
$container = ...;
 
$pass = new RegisterRoutersPass('cmf_routing.router', 'router');
$container->addCompilerPass($pass);

在添加过程和配置容器构建器之后,你继续编译容器,如Symfony DI组件编译部分中所述。

你可以选择配置路由链服务名称,编译将传递修改此服务定义以在从容器加载路由链时注册路由。如果你不指定任何内容,则服务名称为 cmf_routing.router

Routers 

ChainRouter 本身不能进行任何实际的路由决策。它的唯一责任是管理给定的路由器集合,它负责匹配请求和确定其参数。

通过实现 RouterInterface 接口,你可以很容易的创建你自己的路由,但是Symfony CMF的路由组件已经包含有一套强力的、可随需扩展的路由匹配系统。

Symfony Default Router 

Symfony路由机制本身是一个 RouterInterface 实现的,这意味着你可以使用它作为一个路由器在 ChainRouter。这是个允许你使用默认的路由声明系统。在核心文档的 Routing Component 文章中了解有关此路由器的更多信息。

Dynamic Router 

动态路由最好以较低的优先级添加,因为默认路由器在进行路由决策时速度更快。

请阅读下一节中的 动态路由器

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)