如您所见,一个路由可以匹配通配符(通过正则表达式),只有特定路由HTTP方法,或主机名。但是路由系统可以扩展到一个几乎无限的使用灵活性条件:

  • YAML
  • XML
  • PHP
1 2 3 4
联系人:路径:/联系默认值:{_controller:AcmeDemoBundle:主要:接触}条件:“context.getMethod()[‘得到’,‘头’]和request.headers.get(“用户代理”)匹配/ firefox /我”

条件是一个表情,你可以在这里了解更多关于它的语法:<一个href=”//www.oldmanjams.com/doc/2.4/components/expression_language/syntax.html" class="reference internal">表达式语法。,路线不匹配,除非HTTP方法是GET或头如果用户代理标题匹配火狐

你可以做任何你需要复杂的逻辑表达式利用两个变量传递到表达式:

  • 上下文的一个实例:<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Routing/RequestContext.php" class="reference external" title="RequestContext”rel="external noopener noreferrer" target="_blank">RequestContext拥有最基本的路由信息匹配;
  • 请求:Symfo欧宝娱乐app下载地址ny<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/HttpFoundation/Request.php" class="reference external" title="请求”rel="external noopener noreferrer" target="_blank">请求对象(如<一个href=”//www.oldmanjams.com/doc/2.4/components/http_foundation/introduction.html" class="reference internal">HttpFoundation组件)。

谨慎

条件是考虑当生成的URL。

在幕后,表达式编译原始PHP。我们的示例将生成以下PHP缓存目录中:

1 2 3 4 5 6
如果(美元pathinfo= = =' /接触'& & (in_array (美元上下文- >getMethod (),数组(0= >“获得”,1= >“头”)& & preg_match (“/ firefox /我”,美元请求- >- >get (“用户代理”)))){/ /……}

因此,使用条件主要原因没有额外的开销超出了时间底层PHP执行。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# app / config / routing.ymlarticle_show:路径:/文章/{文化}/{一}/{标题}{_format}。默认值:{_controller:AcmeDemoBundle:文章:显示,_format:html}要求:文化:在| fr_format:html | rss年:\ d +

正如您所看到的,这条路如果只会匹配{文化}URL的一部分fr如果{一}是一个数字。这条路还展示了如何使用占位符之间的一个点,而不是削减。的url匹配这条路线的样子:

  • /文章/ en / 2010 /我的帖子
  • / / fr / 2010 / my-post.rss文章
  • / / en / 2013 / my-latest-post.html文章

这个例子还强调了特殊_format路由参数。使用这个参数时,匹配的值变成了“请求格式”请求对象。最终,请求格式设置等用于这样的事情内容类型的响应(如json请求格式转化为内容类型application / json)。它也可以用于控制器来呈现不同的模板的每个值_format。的_format参数是一个非常强大的方式来呈现相同的内容在不同的格式。

请注意

有时你想让你的某些部分全球航线可配置的。欧宝娱乐app下载地址Symfony提供了方法利用服务容器参数。阅读更多关于这个的”<一个href=”//www.oldmanjams.com/doc/2.4/cookbook/routing/service_container_parameters.html" class="reference internal">如何使用服务容器参数在你的路线吗”。

_controller控制器参数,后者决定时应该执行这条路线相匹配。这个参数使用一个简单的字符串模式称为逻辑控制器名称PHP, Sym欧宝娱乐app下载地址fony映射到一个特定的方法和类。该模式有三个部分,每个冒号隔开:

:控制器:行动

例如,一个_controller的价值AcmeBlogBundle:博客:显示意思是:

控制器类 方法名称
AcmeBlogBundle BlogController showAction

控制器可能会看起来像这样:

1 2 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / BlogBundle /控制器/ BlogController.php名称空间Acme\BlogBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;BlogController扩展控制器{公共函数showAction(美元鼻涕虫){/ /……}}

请注意,Symfony添欧宝娱乐app下载地址加字符串控制器类名(博客= >BlogController),行动方法名(显示= >showAction)。

你也可以参考这个控制器使用完全限定类名和方法:Acme \ BlogBundle \控制器\ BlogController: showAction。但如果你遵循一些简单的规则,逻辑名称更简洁,并允许更大的灵活性。

请注意

除了使用逻辑名或完全限定类名,Symfony支持第三种方法指的是一个控制器。欧宝娱乐app下载地址这个方法使用一个冒号分隔符(如。service_name: indexAction),是指控制器作为服务(见<一个href=”//www.oldmanjams.com/doc/2.4/cookbook/controller/service.html" class="reference internal">如何定义控制器作为服务吗)。

应用程序/配置/ routing.yml(见<一个href=”//www.oldmanjams.com/doc/2.4/book/routing.html" class="reference internal">创建路线如上图所示)。通常,然而,你要从其他地方加载路线,像一个路由文件,住在一个包。这可以通过“进口”文件:

  • YAML
  • XML
  • PHP
1 2 3
# app / config / routing.ymlacme_hello:资源:“@AcmeHelloBundle /资源/ config / routing.yml”

请注意

当从YAML进口资源,(如的关键。acme_hello)是毫无意义的。确保它的独特所以没有其他线路覆盖它。

资源关键负荷给定的路由资源。在这个例子中,资源是一个文件的完整路径,其中@AcmeHelloBundle快捷语法解析包的路径。导入的文件可能看起来像这样:

  • YAML
  • XML
  • PHP
1 2 3 4
# src / Acme / HelloBundle /资源/ config / routing.ymlacme_hello:路径:/ hello /{名称}默认值:{_controller:AcmeHelloBundle:你好:索引}

这个文件被解析和加载的路线以同样的方式作为主要的路由文件。

你可以设置主机正则表达式对进口路线。有关更多信息,请参见<一个href=”//www.oldmanjams.com/doc/2.4/components/routing/hostname_pattern.html" class="reference internal">如何匹配基于主机的路由

匹配()和<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Routing/Router.php" class="reference external" title="生成()”rel="external noopener noreferrer" target="_blank">生成()方法形成这种双向系统。取blog_show路线从先前的例子:

1 2 3 4 5 6 7 8
美元参数个数=美元- >get (“路由器”)- >匹配(/博客/我的博客帖子的);/ /数组(/ /“鼻涕虫”= >“我的博客帖子”,/ /“_controller”= >“AcmeBlogBundle:博客:显示”,/ /)美元uri=美元- >get (“路由器”)- >生成(“blog_show”,数组(“鼻涕虫”= >“我的博客帖子”));/ / /博客/我的博客帖子

生成一个URL,您需要指定路线的名称(如。blog_show)和任何通配符(如。蛞蝓=我的博客帖子)用于路由的路径。根据这些信息,任何URL可以很容易地生成:

1 2 3 4 5 6 7 8 9 10 11 12
MainController扩展控制器{公共函数showAction(美元鼻涕虫){/ /……美元url=美元- >generateUrl (“blog_show”,数组(“鼻涕虫”= >“我的博客帖子”));}}

请注意

控制器不延长Symfony的基地欧宝娱乐app下载地址<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php" class="reference external" title="控制器”rel="external noopener noreferrer" target="_blank">控制器,你可以使用路由器服务的<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Routing/Router.php" class="reference external" title="生成()”rel="external noopener noreferrer" target="_blank">生成()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\DependencyInjection\ContainerAware;MainController扩展ContainerAware{公共函数showAction(美元鼻涕虫){/ /……美元url=美元- >容器- >get (“路由器”)- >生成(“blog_show”,数组(“鼻涕虫”= >“我的博客帖子”));}}

在即将到来的一节中,您将了解如何从内部生成的url模板。

提示

如果您的应用程序的前端使用Ajax请求,您可能希望能够生成url在JavaScript中根据你的路由配置。通过使用<一个href=”https://github.com/FriendsOfSymfony/FOSJsRoutingBundle" class="reference external" rel="external noopener noreferrer" target="_blank">FOSJsRoutingBundle,你也可以这样做:

1 2 3 4
varurl = Routing.generate (“blog_show”,{“鼻涕虫”:“我的博客帖子”});

有关更多信息,请参见文档包。欧宝体育电话

这项工作,包括代码示例,许可下<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons冲锋队3.0许可证。
版本: