如何创建自定义路由加载器
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何创建自定义路由加载器
什么是自定义路由加载器
自定义路由加载器使您能够基于一些约定或模式生成路由。这个用例的一个很好的例子是FOSRestBundle其中路由是根据控制器中动作方法的名称生成的。
自定义路由加载器不允许你的bundle在不修改路由配置的情况下注入路由。应用程序/配置/ routing.yml
手动)。如果您的包提供路由,无论是通过配置文件,如WebProfilerBundle
是,还是通过自定义路由加载器,如FOSRestBundle则始终需要路由配置中的一个条目。
请注意
例如,有许多捆绑包使用它们自己的路由加载器来完成如上所述的情况FOSRestBundle,JMSI18nRoutingBundle,KnpRadBundle而且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娱乐下载\组件\路由\RouteCollection;类ExtraLoader扩展加载程序{私人$加载=假;公共函数负载($资源,$类型= null){如果(真正的===$这->加载){扔新\ RuntimeException (“不要添加“额外”加载器两次”);}$路线=新RouteCollection ();//准备一个新的路由$路径=“额外/{参数}”;$违约=数组(“_controller”= >“AppBundle:额外的:”,);$需求=数组(“参数”= >“\ d +”,);$路线=新路线($路径,$违约,$需求);//添加新的路由到路由集合$routeName=“extraRoute”;$路线->add ($routeName,$路线);$这->加载=真正的;返回$路线;}公共函数支持($资源,$类型= null){返回“额外的”===$类型;}}
确保您指定的控制器确实存在。在这种情况下,您必须创建一个extraAction
方法中的ExtraController
的AppBundle
:
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娱乐下载\组件\路由\RouteCollection;类AdvancedLoader扩展加载程序{公共函数负载($资源,$类型= null){$集合=新RouteCollection ();$资源=“@AppBundle /资源/ config / import_routing.yml”;$类型=yaml的;$importedRoutes=$这->导入($资源,$类型);$集合->addCollection ($importedRoutes);返回$集合;}公共函数支持($资源,$类型= null){返回“advanced_extra”===$类型;}}
请注意
导入的路由配置的资源名称和类型可以是路由配置加载器通常支持的任何类型(YAML、XML、PHP、注释等)。