路由组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.4,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

路由组件

路由组件将HTTP请求映射到一组配置变量。

安装

1
美元作曲家需要symfony /路由:欧宝娱乐app下载地址^ 3.4

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

使用

另请参阅

这篇文章解释了如何使用路由功能作为一个独立的组件在任何PHP应用程序。读了路由文章在Symfony应用程序了解如何使用它。欧宝娱乐app下载地址

为了建立一个基本的路由系统需要三个部分:

这是一个简单的例子。注意,这个假设您已经配置了自动装卸机加载路由组件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用欧宝娱乐app下载地址\组件\路由\匹配器\UrlMatcher;使用欧宝娱乐app下载地址\组件\路由\RequestContext;使用欧宝娱乐app下载地址\组件\路由\路线;使用欧宝娱乐app下载地址\组件\路由\RouteCollection;美元路线=路线(' / foo ',(“_controller”= >“MyController”]);美元路线=RouteCollection ();美元路线- >add (“route_name”,美元路线);美元上下文=RequestContext (' / ');美元匹配器=UrlMatcher (美元路线,美元上下文);美元参数=美元匹配器- >匹配(' / foo ');/ / [' _controller ' = > ' MyController ', ' _route ' = > ' route_name ']

请注意

RequestContext参数可以填充中存储的值$ _SERVER,但它是更容易使用HttpFoundation组件作为解释道下面

你可以添加尽可能多的路线RouteCollection

RouteCollection: add ()方法有两个参数。第一个是路线的名称。第二个是一个路线对象,它将URL路径和一些自定义的变量在其构造函数的数组。这种阵列的自定义变量任何东西这是重要的应用程序,当路由匹配返回。

UrlMatcher::匹配()返回变量的设置以及通配符的路由上占位符(见下文)。您的应用程序现在可以使用此信息来继续处理请求。除了配置变量_route关键是补充说,该公司持有的名称匹配。

如果没有匹配的路由可以找到,ResourceNotFoundException将抛出。

定义路由

一个完整的路由定义可以包含多达八个部分:

  1. URL模式。这是匹配的URL传递到RequestContext。它不是一个正则表达式,但可以包含通配符占位符(如命名。{蛞蝓}在URL)来匹配动态部分。该组件将创建正则表达式。
  2. 一个默认的参数数组。这将返回包含任意的值的数组,当请求匹配的路线。按照惯例用于控制器映射到路线。
  3. 一个数组的需求。这些定义约束的值占位符模式的正则表达式。
  4. 一个选项数组。这些包含高级设置路由,可以用来控制编码或定制编译。看到路由组件在下面。你可以通过阅读了解更多关于它们setoption ()实现。
  5. 一个主机。这是匹配请求的主机。看到如何匹配基于主机的路由为更多的细节。
  6. 一个数组的计划。这些执行特定的HTTP方案(http,https)。
  7. 一个数组的方法。这些执行特定的HTTP请求方法(,得到,帖子,……)。
  8. 一个条件,使用表达式语法。一个字符串,该字符串必须评估真正的所以比赛的路线。看到如何通过条件限制路由匹配为更多的细节。

采取以下路线,将其中的几个想法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
美元路线=路线(“/归档/{月}”,/ /路径(“_controller”= >“showArchive”),/ /默认值(“月”= >“[0 - 9]{4}[0 - 9]{2}”,“子域名”= >“www |米”),/ /要求[],/ /选项“.example.com{子域名}”,/ /主机[],/ /计划[],/ /方法“context.getHost()“/匹配(安全|管理).example.com/”/ /条件);/ /……美元参数=美元匹配器- >匹配(/归档/ 2012 - 01年的);/ / (/ /“_controller”= >“showArchive”,/ / '月' = > ' 2012 - 01年',/ /“子域名”= >“www”,/ / ' _route ' = >……/ /)美元参数=美元匹配器- >匹配(“/归档/ foo”);/ /抛出ResourceNotFoundException

在这种情况下,路线相匹配/归档/ 2012 - 01,因为{月}通配符匹配给定的正则表达式通配符。然而,/归档/ foo匹配,因为“foo”失败的通配符。

使用通配符时,当调用这些数组中返回结果匹配。通配符匹配的路径的一部分(例如2012 - 01)作为值。

一个占位符匹配任何字符除了斜杠/默认情况下,除非你定义一个特定的要求。原因是他们按照惯例用于分离不同的占位符。

如果你想要一个占位符匹配什么的话,那一定是最后的路线:

1 2 3 4 5
美元路线=路线(' /启动/{所需}/{任何}',(“要求”= >“默认”),/ /应该被定义(“什么”= >”。*’]/ /明确的要求,允许“/”);

通过阅读了解更多关于它如何让一个“/”字符在一个路由参数

使用前缀和收集设置

您可以添加路线或其他的实例RouteCollection另一个收集。这样就可以建立一个树的路线。另外您可以定义一个前缀和默认值的参数要求,选择,方案和主机的所有航线使用方法提供的子树RouteCollection类:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元rootCollection=RouteCollection ();美元subCollection=RouteCollection ();美元subCollection- >添加(…);美元subCollection- >添加(…);美元subCollection- >addPrefix (/前缀的);美元subCollection- >addDefaults ([…]);美元subCollection- >addRequirements ([…]);美元subCollection- >使用addoption ([…]);美元subCollection- >setHost (“.example.com{子域名}”);美元subCollection- >setMethods ([“职位”]);美元subCollection- >setSchemes ([“https”]);美元subCollection- >setCondition (“context.getHost()“/匹配(安全|管理).example.com/”);美元rootCollection- >addCollection (美元subCollection);

设置请求参数

RequestContext提供关于当前请求的信息。您可以定义一个HTTP请求的所有参数与这类通过其构造函数:

1 2 3 4 5 6 7 8 9 10
公共函数__construct(美元baseUrl=,美元方法=“得到”,美元主机=“localhost”,美元计划=“http”,美元httpPort=80年,美元httpsPort=443年,美元路径=' / ',美元变量的名称=)

通常你可以通过值$ _SERVER变量来填充RequestContext。但是如果你使用HttpFoundation组件,您可以使用它请求类来喂RequestContext快捷方式:

1 2 3 4
使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;美元上下文=RequestContext ();美元上下文- >fromRequest(请求::createFromGlobals ());

生成一个URL

UrlMatcher试图找到一个适合的路线给定的请求也可以构建一个URL从特定的路线UrlGenerator:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\路由\发电机\UrlGenerator;使用欧宝娱乐app下载地址\组件\路由\RequestContext;使用欧宝娱乐app下载地址\组件\路由\路线;使用欧宝娱乐app下载地址\组件\路由\RouteCollection;美元路线=RouteCollection ();美元路线- >add (“show_post”,路线(' /显示/{蛞蝓}'));美元上下文=RequestContext (' / ');美元发电机=UrlGenerator (美元路线,美元上下文);美元url=美元发电机- >生成(“show_post”,(“鼻涕虫”= >“我的博客帖子”]);/ / /显示/我的博客帖子

请注意

如果您定义了一个计划,一个绝对URL生成如果当前的计划RequestContext不匹配的要求。

检查是否存在一个路线

在高度动态的应用程序中,可能需要在使用前检查是否存在一个路径来生成一个URL。在这些情况下,不要使用getRouteCollection ()方法,因为恢复路由缓存和减慢应用程序。

相反,尝试生成URL和捕获RouteNotFoundException时抛出的路线不存在:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\路由\异常\RouteNotFoundException;/ /……试一试{美元url=美元发电机- >生成(美元dynamicRouteName,美元参数);}(RouteNotFoundException美元e){/ /定义的路线不是……}

从文件中加载路径

您已经看到了如何添加路线集合在PHP。但是你也可以从许多不同的加载路径文件。

路由组件有一个类装入器的数量,每个给你的能力从一个外部文件加载路径的集合定义的格式。每个加载程序预计FileLocator实例构造函数参数。您可以使用FileLocator定义一个数组的路径加载程序将寻找所请求的文件。如果找到该文件,加载程序返回RouteCollection

如果你使用YamlFileLoader,然后路线的定义是这样的:

1 2 3 4 5 6 7 8
# routes.ymlroute1:路径:/ foo默认值:{_controller:“MyController:: fooAction”}route2:路径:/ foo / bar默认值:{_controller:“MyController:: foobarAction”}

加载这个文件,您可以使用下面的代码。这假设你routes.yml文件在同一目录如下的代码:

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\配置\FileLocator;使用欧宝娱乐app下载地址\组件\路由\加载程序\YamlFileLoader;/ /是这里面* *目录中美元fileLocator=FileLocator ([__DIR__]);美元加载程序=YamlFileLoader (美元fileLocator);美元路线=美元加载程序- >负载(“routes.yml”);

除了YamlFileLoader有两个其他装载机工作相同的方式:

如果你使用PhpFileLoader你必须提供一个PHP文件的名称返回一个RouteCollection:

1 2 3 4 5 6 7 8 9 10 11 12
/ / RouteProvider.php使用欧宝娱乐app下载地址\组件\路由\路线;使用欧宝娱乐app下载地址\组件\路由\RouteCollection;美元路线=RouteCollection ();美元路线- >add (“route_name”,路线(' / foo ',(“_controller”= >“ExampleController”)));/ /……返回美元路线;

路线是闭包

还有一ClosureLoader,它调用闭包和使用结果RouteCollection:

1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址\组件\路由\加载程序\ClosureLoader;美元关闭=函数(){返回RouteCollection ();};美元加载程序=ClosureLoader ();美元路线=美元加载程序- >负载(美元关闭);

路线是注释

最后但并非最不重要的AnnotationDirectoryLoaderAnnotationFileLoader从类加载路径定义注释。具体细节是离开这里。

请注意

为了使用注释装载机,你应该安装了教义/注释教义/缓存包与作曲家。

提示

注释的类不自动加载,所以你必须使用类加载器加载它们是这样的:

1 2 3 4 5 6 7 8 9
使用作曲家\自动装载\类加载器;使用学说\常见的\注释\AnnotationRegistry;/ * *@var类加载器加载程序* /美元美元加载程序=需要__DIR__“/ . . /供应商/ autoload.php”;AnnotationRegistry::registerLoader ([美元加载程序,“loadClass”]);返回美元加载程序;

一体化的路由器

路由器类是一个一体化的包使用路由组件。构造函数预期加载程序实例,主要路径路由定义和其他一些设置:

1 2 3 4 5 6 7
公共函数__construct(LoaderInterface美元加载程序,美元资源数组,美元选项= [],RequestContext美元上下文= null, LoggerInterface美元日志记录器= null);

cache_dir选择您可以启用路由缓存(如果你提供一个路径)或禁用缓存(如果它的设置)。缓存是在后台自动完成,如果你想使用它。一个基本的例子路由器类的样子:

1 2 3 4 5 6 7 8 9 10 11
美元fileLocator=FileLocator ([__DIR__]);美元requestContext=RequestContext (' / ');美元路由器=路由器(YamlFileLoader (美元fileLocator),“routes.yml”,(“cache_dir”= >__DIR__/缓存的),美元requestContext);美元参数=美元路由器- >匹配(“/ foo / bar”);美元url=美元路由器- >生成(“some_route”,(“参数”= >“价值”]);

请注意

如果你使用缓存,路由组件将保存在编译新类cache_dir。这意味着您的脚本必须有写权限的位置。

Unicode路由支持

3.2

utf - 8的支持路由路径和需求是在Symfony 3.2中引入的。欧宝娱乐app下载地址

路由路径的路由组件支持utf - 8字符和需求。多亏了use utf8路线的选择,你可以Symfony和utf - 8字符匹欧宝娱乐app下载地址配和生成路线:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / AppBundle /控制器/ DefaultController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用欧宝娱乐app下载地址\组件\路由\注释\路线;DefaultController扩展控制器{/ * * *@Route(“/类别/{名称}”,name = " route1 "选项= {“use utf8”:真})* /公共函数categoryAction(){/ /……}

这条路线的use utf8选项设置为真正的Symfon欧宝娱乐app下载地址y考虑要求匹配任何utf - 8字符而不是单个字节字符。这意味着,所以下面的url匹配:/类别/日本語,/类别/فارسی,/类别/한국어等。如果你想知道,这个选项还允许包括和匹配emojis url。

您还可以包括utf - 8字符串作为路由要求:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src / AppBundle /控制器/ DefaultController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用欧宝娱乐app下载地址\组件\路由\注释\路线;DefaultController扩展控制器{/ * * *@Route(* " /类别/{名称}”,*的名字=“route2”, *缺省值={“名称”:“한국어”},*选项= {“use utf8”:真}*)* /公共函数defaultAction(){/ /……}

提示

除了utf - 8字符外,还支持所有的路由组件PCRE Unicode属性的转义序列匹配通用字符类型。例如,陆\ p {}匹配任何大写字符在任何语言中,希腊\ p {}匹配任何希腊字符,韩\ P {}匹配任何字符不包括在中国汉族脚本。

请注意

在Sy欧宝娱乐app下载地址mfony 3.2中,不需要显式地设置use utf8选择。一旦Symfony发现欧宝娱乐app下载地址一个utf - 8字符在路由路径或需求,它会自动打开utf - 8的支持。然而,这种行为是弃用和Symfony 4.0中需要设置的选项。欧宝娱乐app下载地址

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。