支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
协力文档 symfonychina感谢Yedrops的奉献。
Symfony CMF Routing组件的核心是 ChainRouter
。它用于替代Symfony的默认路由系统。
ChainRouter
的工作策略是通过接受一组优先级的路由,RouterInterface
实现,通常称为“路由器”。
处理传入请求时,ChainRouter
根据其配置的优先级对配置的路由器进行迭代,直到其中一个能够 match
(匹配)请求或匹配URL并提供请求参数。
一直以来,路由就不得不单独地去匹配URL中的字符串。从Symfony 2.2起,它可选地实现了 RequestMatcherInterface
接口,如果路由希望使用请求中的其他信息比如domain或accept-encoding,它可以对完整的 Request
对象进行匹配。 ChainRouter
支持这两种路由匹配。
使用 ChainRouter
的 add
方法添加路由,使用此方法添加默认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。
此组件提供了一个 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
。
ChainRouter
本身不能进行任何实际的路由决策。它的唯一责任是管理给定的路由器集合,它负责匹配请求和确定其参数。
通过实现 RouterInterface
接口,你可以很容易的创建你自己的路由,但是Symfony CMF的路由组件已经包含有一套强力的、可随需扩展的路由匹配系统。
Symfony路由机制本身是一个 RouterInterface
实现的,这意味着你可以使用它作为一个路由器在 ChainRouter
。这是个允许你使用默认的路由声明系统。在核心文档的 Routing Component 文章中了解有关此路由器的更多信息。
动态路由最好以较低的优先级添加,因为默认路由器在进行路由决策时速度更快。
请阅读下一节中的 动态路由器。
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。