如何创建一个定制的路线装载机

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何创建一个定制的路线装载机

什么是自定义路由装载机

自定义路径加载程序使您能够生成路线基于一些约定或模式。这个用例是一个很好的例子FOSRestBundle路线在哪里生成基于控制器动作方法的名称。

你还需要修改(如路由配置。应用程序/配置/ routing.yml手动),即使使用自定义路径加载程序。

请注意

有很多包,使用自己的路线完成上述这种情况下加载器,例如FOSRestBundle,JMSI18nRoutingBundle,KnpRadBundleSonataAdminBundle

加载路径

的路线在Symfony应用程序加ob娱乐下载载的DelegatingLoader。该装载机使用其他几个不同类型的加载器(代表)加载资源,例如YAML文件或@Route@Method注释在控制器文件。专业的加载器实现LoaderInterface因此有两个重要的方法:支持()load ()

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

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

主要装载机解析时,所有注册代表装载机和调用它们支持()方法用给定的资源(@AppBundle /控制器/)和类型(注释)作为参数。当一个装载机的回报真正的,它的load ()方法将调用,它应该返回一个RouteCollection包含路线对象。

请注意

航线装载这种方式将缓存路由器一样当他们被定义在一个默认的格式(如XML、YML、PHP文件)。

创建一个自定义加载程序

从一些自定义源加载路径(即从除了注释,YAML或XML文件),您需要创建一个自定义路径加载程序。这个加载程序必须实现LoaderInterface

在大多数情况下更容易扩展加载程序而不是实现LoaderInterface你自己。

下面的示例加载器加载路由支持资源的类型额外的。类型名称不应与其他装载机可能支持相同类型的资源。只是构成特定于你所做的一个名字。资源名称本身并不实际使用的例子:

1 2 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
/ / src / AppBundle /路由/ ExtraLoader.php名称空间AppBundle\路由;使用ob娱乐下载\组件\配置\加载程序\加载程序;使用ob娱乐下载\组件\路由\路线;使用ob娱乐下载\组件\路由\RouteCollection;ExtraLoader扩展加载程序{私人美元加载=;公共函数负载(美元资源,美元类型= null){如果(真正的= = =美元- >加载){\ RuntimeException (“不添加“额外”装载机的两倍);}美元路线=RouteCollection ();/ /准备一个新的途径美元路径=“额外/{参数}”;美元违约=数组(“_controller”= >“AppBundle:额外的:”,);美元需求=数组(“参数”= >“\ d +”,);美元路线=路线(美元路径,美元违约,美元需求);/ /添加新途径收集的路线美元routeName=“extraRoute”;美元路线- >add (美元routeName,美元路线);美元- >加载=真正的;返回美元路线;}公共函数支持(美元资源,美元类型= null){返回“额外的”= = =美元类型;}}

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

1 2 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:资源:类型:额外的

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

请注意

使用自定义路径加载器定义的路线由框架会自动缓存。所以当你改变一些事情在加载程序类本身,别忘了清除缓存。

更高级的加载器

如果您的自定义路由装载机延伸加载程序如上所示,您还可以利用所提供的解析器的一个实例LoaderResolver负载二级路由资源。

当然你仍然需要实现支持()load ()。每当你想要加载另一个资源——例如YAML路由配置文件——你可以调用进口()方法:

1 2 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娱乐下载\组件\路由\RouteCollection;AdvancedLoader扩展加载程序{公共函数负载(美元资源,美元类型= null){美元集合=RouteCollection ();美元资源=“@AppBundle /资源/ config / import_routing.yml”;美元类型=yaml的;美元importedRoutes=美元- >导入(美元资源,美元类型);美元集合- >addCollection (美元importedRoutes);返回美元集合;}公共函数支持(美元资源,美元类型= null){返回“advanced_extra”= = =美元类型;}}

请注意

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

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