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

编辑该页面

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

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

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

什么是自定义路由装载机

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

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

请注意

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

加载路径

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

把这些线的routes.yaml:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/ routes.yaml控制器:资源:. . / src /控制器/类型:注释

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

请注意

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

加载路径与一个定制的服务

使用常规Symfony服务是最简ob娱乐下载单的方式加载路线以定制的方式。容易得多比创建一个完全定制的路线装载机,所以你应该总是首先考虑这个选项。

为此,定义服务类型:加载路由资源的类型和配置服务和方法调用:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/ routes.yamladmin_routes:资源:“admin_route_loader:: loadRoutes”类型:服务

在这个例子中,路线是通过调用加载loadRoutes ()方法的服务IDadmin_route_loader。你的服务不需要扩展或实现任何特殊类,但被调用的方法必须返回RouteCollection对象。

请注意

使用服务定义的路由路径加载器会自动缓存的框架。所以每当你的服务应该加载新的路线,别忘了清除缓存。

创建一个自定义加载程序

从一些自定义源加载路径(即从除了注释,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 /路由/ ExtraLoader.php名称空间应用程序\路由;使用ob娱乐下载\组件\配置\加载程序\加载程序;使用ob娱乐下载\组件\路由\路线;使用ob娱乐下载\组件\路由\RouteCollection;ExtraLoader扩展加载程序{私人美元isLoaded=;公共函数负载(美元资源,美元类型= null){如果(真正的= = =美元- >isLoaded) {\ RuntimeException (“不添加“额外”装载机的两倍);}美元路线=RouteCollection ();/ /准备一个新的途径美元路径=“额外/{参数}”;美元违约= (“_controller”= >控制器应用\ \ ExtraController:额外的,);美元需求= (“参数”= >“\ d +”,);美元路线=路线(美元路径,美元违约,美元需求);/ /添加新途径收集的路线美元routeName=“extraRoute”;美元路线- >add (美元routeName,美元路线);美元- >isLoaded =真正的;返回美元路线;}公共函数支持(美元资源,美元类型= null){返回“额外的”= = =美元类型;}}

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

1 2 3 4 5 6 7 8 9 10 11 12 13
/ / src /控制器/ ExtraController.php名称空间应用程序\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;ExtraController扩展AbstractController{公共函数额外的(美元参数){返回响应(美元参数);}}

现在定义一个服务ExtraLoader:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/ services.yaml服务:#……应用\ \ ExtraLoader路由:标签:(routing.loader)

请注意标签routing.loader。所有服务与此标签将标记为潜在路径加载器和添加专业路线装载机吗routing.loader服务的一个实例DelegatingLoader

使用自定义加载程序

如果你没有事,您的自定义路由装载机被称为。剩下要做的就是将几行添加到路由配置:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/ routes.yamlapp_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 /路由/ AdvancedLoader.php名称空间应用程序\路由;使用ob娱乐下载\组件\配置\加载程序\加载程序;使用ob娱乐下载\组件\路由\RouteCollection;AdvancedLoader扩展加载程序{公共函数负载(美元资源,美元类型= null){美元路线=RouteCollection ();美元资源=“@ThirdPartyBundle /资源/ config / routes.yaml”;美元类型=yaml的;美元importedRoutes=美元- >导入(美元资源,美元类型);美元路线- >addCollection (美元importedRoutes);返回美元路线;}公共函数支持(美元资源,美元类型= null){返回“advanced_extra”= = =美元类型;}}

请注意

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

请注意

对于更高级的使用,检查ChainRouterSymfony CMF所提供的项ob娱乐下载目。这个路由器允许应用程序使用两个或两个以上的路由器组合,例如将使用默认的Symfony路由系统在编写一个定制的路由器。ob娱乐下载

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