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

编辑本页

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

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

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

自定义路由加载器允许您向应用程序添加路由,而不包括它们,例如,在Yaml文件中。当你有一个bundle,但不想手动为该bundle添加路由时,这就很方便了应用程序/配置/ routing.yml.当您想要使bundle可重用时,或者当您已经开放了它的源代码时,这可能特别重要,因为这会减慢安装过程并使其容易出错。

另外,当您希望根据某种约定或模式自动生成或定位路由时,也可以使用自定义路由加载器。一个例子是FOSRestBundle其中路由是根据控制器中的动作方法的名称生成的。

请注意

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

加载路径

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

routing.yml

1 2 3 4
_demo:资源:“@AcmeDemoBundle /控制器/ DemoController.php”类型:注释前缀:/演示

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

创建自定义加载器

要从一些自定义源加载路由(即从注解、Yaml或XML文件以外的东西加载路由),你需要创建一个自定义路由加载器。这个加载器应该实现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 44 45 46 47 48 49 50 51 52
名称空间AcmeDemoBundle路由使用ob娱乐下载组件配置加载程序LoaderInterface使用ob娱乐下载组件配置加载程序LoaderResolverInterface使用ob娱乐下载组件路由路线使用ob娱乐下载组件路由RouteCollectionExtraLoader实现了LoaderInterface私人加载公共函数负载资源类型= null)如果真正的===->加载){\ RuntimeException (“不要添加“额外”加载器两次”);}路线RouteCollection ();//准备一个新的路由模式“额外/{参数}”违约数组“_controller”= >AcmeDemoBundle:演示:额外的,);需求数组“参数”= >“\ d +”,);路线路线(模式违约需求);//添加新的路由到路由集合routeName“extraRoute”路线->add (routeName路线);返回路线;}公共函数支持资源类型= null)返回“额外的”===类型;}公共函数getResolver()//需要,但可以为空,除非你想加载其他资源//如果你这样做,使用Loader基类更容易(见下文)公共函数setResolver(LoaderResolverInterface解析器//同上}}

请注意

确保您指定的控制器确实存在。

属性定义服务ExtraLoader

  • YAML
  • XML
  • PHP
1 2 3 4 5
服务:acme_demo.routing_loader:类:Acme \ DemoBundle \ \ ExtraLoader路由标签:-名称:routing.loader

注意标签routing.loader.带有此标记的所有服务将被标记为潜在的路由加载器,并作为专用路由器添加到DelegatingLoader

使用自定义加载器

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

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

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

请注意

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

更先进的装载机

在大多数情况下,最好不要实现它LoaderInterface自己,却从自己延伸加载程序.这个类知道如何使用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
名称空间AcmeDemoBundle路由使用ob娱乐下载组件配置加载程序加载程序使用ob娱乐下载组件路由RouteCollectionAdvancedLoader扩展加载程序公共函数负载资源类型= null)集合RouteCollection ();资源“@AcmeDemoBundle /资源/ config / import_routing.yml”类型yaml的importedRoutes->导入(资源类型);集合->addCollection (importedRoutes);返回集合;}公共函数支持资源类型= null)返回类型===“advanced_extra”;}}

请注意

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

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