如何创建自定义路由加载器

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何创建自定义路由加载器

什么是自定义路由加载器

自定义路由加载器使您能够基于一些约定或模式生成路由。这个用例的一个很好的例子是FOSRestBundle其中路由是根据控制器中动作方法的名称生成的。

自定义路由加载器不允许你的bundle在不修改路由配置的情况下注入路由。应用程序/配置/ routing.yml手动)。如果您的包提供路由,无论是通过配置文件,如WebProfilerBundle是,还是通过自定义路由加载器,如FOSRestBundle则始终需要路由配置中的一个条目。

请注意

例如,有许多捆绑包使用它们自己的路由加载器来完成如上所述的情况FOSRestBundleJMSI18nRoutingBundleKnpRadBundle而且SonataAdminBundle

加载路径

类加载Symfony应用程序中的ob娱乐下载路由DelegatingLoader.这个加载器使用其他几个加载器(委托)来加载不同类型的资源,例如YAML文件或@Route而且@Method控制器文件中的注释。专门的加载器实现LoaderInterface因此有两个重要的方法:支持()而且load ()

看看这些线条routing.yml在Symfonob娱乐下载y标准版:

1 2 3 4
# app / config / routing.yml应用:资源:@AppBundle /控制器/类型:注释

当主加载器解析这个时,它会尝试所有已注册的委托加载器并调用它们的支持()方法使用给定资源(@AppBundle /控制器/)和类型(注释)作为参数。当其中一个加载器返回时真正的,它的load ()方法将被调用,该方法将返回RouteCollection包含路线对象。

创建自定义加载器

要从一些自定义源加载路由(即从注解、YAML或XML文件以外的东西加载路由),你需要创建一个自定义路由加载器。这个加载器必须实现LoaderInterface

在大多数情况下,最好不要实现它LoaderInterface自己,却从自己延伸加载程序

类型的示例加载器支持加载路由资源额外的.类型额外的这并不重要——你可以发明任何你想要的资源类型。资源名称本身并没有在示例中实际使用:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
/ / src / AppBundle /路由/ ExtraLoader.php名称空间AppBundle路由使用ob娱乐下载组件配置加载程序加载程序使用ob娱乐下载组件路由路线使用ob娱乐下载组件路由RouteCollectionExtraLoader扩展加载程序私人加载公共函数负载资源类型= null)如果真正的===->加载){\ RuntimeException (“不要添加“额外”加载器两次”);}路线RouteCollection ();//准备一个新的路由路径“额外/{参数}”违约数组“_controller”= >“AppBundle:额外的:”,);需求数组“参数”= >“\ d +”,);路线路线(路径违约需求);//添加新的路由到路由集合routeName“extraRoute”路线->add (routeName路线);->加载=真正的返回路线;}公共函数支持资源类型= null)返回“额外的”===类型;}}

确保您指定的控制器确实存在。在这种情况下,您必须创建一个extraAction方法中的ExtraControllerAppBundle

12 3 4 5 6 7 8 9 10 11 12 13
/ / src / AppBundle /控制器/ ExtraController.php名称空间AppBundle控制器使用ob娱乐下载组件HttpFoundation响应使用ob娱乐下载FrameworkBundle控制器控制器ExtraController扩展控制器公共函数extraAction参数返回响应(参数);}}

属性定义服务ExtraLoader

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / services.yml服务:app.routing_loader:类:AppBundle \ \ ExtraLoader路由标签:-名称:routing.loader

注意标签routing.loader.所有与此相关的服务标签将被标记为潜在的路由加载器,并作为专门的路由加载器添加到routing.loader服务,这是一个实例DelegatingLoader

使用自定义加载器

如果您什么也不做,那么您的自定义路由加载器就会这样做被称为。相反,你只需要在路由配置中添加几行额外的代码:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / routing.ymlapp_extra:资源:类型:额外的

这里重要的部分是类型关键。它的值应该是“extra”,因为这是类型ExtraLoader支持,这将确保它load ()方法被调用。的资源键是无关紧要的ExtraLoader,因此设置为“。”。

请注意

使用自定义路由加载器定义的路由将被框架自动缓存。因此,无论何时更改装入器类本身的内容,都不要忘记清除缓存。

更高级的装载机

如果您的自定义路由加载器从加载程序如上所示,您还可以使用提供的解析器,它是LoaderResolver,加载从路由资源。

当然,您仍然需要实现支持()而且load ().每当您想加载另一个资源(例如YAML路由配置文件)时,都可以调用进口()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/ / src / AppBundle /路由/ AdvancedLoader.php名称空间AppBundle路由使用ob娱乐下载组件配置加载程序加载程序使用ob娱乐下载组件路由RouteCollectionAdvancedLoader扩展加载程序公共函数负载资源类型= null)集合RouteCollection ();资源“@AppBundle /资源/ config / import_routing.yml”类型yaml的importedRoutes->导入(资源类型);集合->addCollection (importedRoutes);返回集合;}公共函数支持资源类型= null)返回“advanced_extra”===类型;}}

请注意

导入的路由配置的资源名称和类型可以是路由配置加载器通常支持的任何类型(YAML、XML、PHP、注释等)。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。