一种颗粒度很小的 Laravel 路由文件划分方式

前端之家收集整理的这篇文章主要介绍了一种颗粒度很小的 Laravel 路由文件划分方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我估计我们所有人都遇到过这样的情况,即我们有一个写满路由的超大文件。不骗你,这让我很长一段时间几近抓狂,我不得不想个办法解决这个问题。 因此,这就是我最终用来构造路由文件方法

最初,我想到了利用路由组方法可以接收文件,这就是 laravel 在 RouteServiceProvider 处拆分路由的方式。

  1. <?PHP
  2. namespace App\Providers;
  3. use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
  4. use Illuminate\Support\Facades\Route;
  5. class RouteServiceProvider extends ServiceProvider
  6. {
  7. /**
  8. * This namespace is applied to your controller routes.
  9. *
  10. * In addition,it is set as the URL generator's root namespace.
  11. *
  12. * @var string
  13. */
  14. protected $namespace = 'App\Http\Controllers';
  15. /**
  16. * Define your route model bindings,pattern filters,etc.
  17. *
  18. * @return void
  19. */
  20. public function boot()
  21. {
  22. //
  23. parent::boot();
  24. }
  25. /**
  26. * Define the routes for the application.
  27. *
  28. * @return void
  29. */
  30. public function map()
  31. {
  32. $this->mapApiRoutes();
  33. $this->mapWebRoutes();
  34. //
  35. }
  36. /**
  37. * Define the "web" routes for the application.
  38. *
  39. * These routes all receive session state,CSRF protection,etc.
  40. *
  41. * @return void
  42. */
  43. protected function mapWebRoutes()
  44. {
  45. Route::middleware('web')
  46. ->namespace($this->namespace)
  47. ->group(base_path('routes/web.PHP'));
  48. }
  49. /**
  50. * Define the "api" routes for the application.
  51. *
  52. * These routes are typically stateless.
  53. *
  54. * @return void
  55. */
  56. protected function mapApiRoutes()
  57. {
  58. Route::prefix('api')
  59. ->middleware('api')
  60. ->namespace($this->namespace)
  61. ->group(base_path('routes/api.PHP'));
  62. }
  63. }

  

我将与用户有关的路由抽象到了一个名为 users.PHP文件中,并将 mapApiRoutes 复制为 mapUsersRoutes 并指向到我的 users.PHP 文件

  1. /**
  2.  
  3. * Define the routes for the application.
  4.  
  5. *
  6.  
  7. * @return void
  8.  
  9. */
  10.  
  11. public function map()
  12.  
  13. {
  14.  
  15. $this->mapApiRoutes();
  16.  
  17. $this->mapWebRoutes();
  18.  
  19. $this->mapUsersRoutes();
  20.  
  21. //
  22.  
  23. }
  24.  
  25. /**
  26.  
  27. * Define the "api" routes for the application.
  28.  
  29. *
  30.  
  31. * These routes are typically stateless.
  32.  
  33. *
  34.  
  35. * @return void
  36.  
  37. */
  38.  
  39. protected function mapUsersRoutes()
  40.  
  41. {
  42.  
  43. Route::prefix('api')
  44.  
  45. ->middleware('api')
  46.  
  47. ->namespace($this->namespace)
  48.  
  49. ->group(base_path('routes/users.PHP'));
  50.  
  51. }

  

我知道您在想什么,显然,这并不是最好的解决方案,因为每当我们需要创建新文件时,都必须像之前一样注册它。 因此,我不得不改进这个最初的想法。

我想到了将整个应用程序中的公共部分拆分成单独的路由文件,并且我想到我们的所有路由都不能超出已认证、访客和公共路由的范围。

我将路由文件夹的结构优化成下面这样:

  1. ├── routes
  2.  
  3. ├── api
  4.  
  5. ├── public
  6.  
  7. | ├── users.PHP
  8.  
  9. ├── auth
  10.  
  11. | ├── users.PHP
  12.  
  13. ├── guest
  14.  
  15. | ├── users.PHP

  

乍一看,您可能会认为 “嗯,它并没有太大变化,我们还是需要去映射这些文件”。 但是,实际上我们可以利用 PHP 原生提供的名为 glob 的函数,这是一种开箱即用的解决方案,因为我们没有与 laravel 的解决方案耦合。

glob 接收一个正则,并且可以在与我们的正则匹配的路径下找到文件名。 因此,我们的路由是在特定文件夹下组织的,我们现在可以在这些文件夹下找到所有文件,并将它们注册到其中间件。

  1. <?PHP
  2.  
  3. namespace App\Providers;
  4.  
  5. use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
  6.  
  7. use Illuminate\Support\Facades\Route;
  8.  
  9. class RouteServiceProvider extends ServiceProvider
  10.  
  11. {
  12.  
  13. /**
  14.  
  15. * This namespace is applied to your controller routes.
  16.  
  17. *
  18.  
  19. * In addition,it is set as the URL generator's root namespace.
  20.  
  21. *
  22.  
  23. * @var string
  24.  
  25. */
  26.  
  27. protected $namespace = 'App\Http\Controllers';
  28.  
  29. /**
  30.  
  31. * Define the routes for the application.
  32.  
  33. *
  34.  
  35. * @return void
  36.  
  37. */
  38.  
  39. public function map()
  40.  
  41. {
  42.  
  43. $this->mapAuthRoutes();
  44.  
  45. $this->mapGuestRoutes();
  46.  
  47. $this->mapPublicRoutes();
  48.  
  49. // $this->mapWebRoutes();
  50.  
  51. //
  52.  
  53. }
  54.  
  55. /**
  56.  
  57. * Define the "web" routes for the application.
  58.  
  59. *
  60.  
  61. * These routes all receive session state,etc.
  62.  
  63. *
  64.  
  65. * @return void
  66.  
  67. */
  68.  
  69. protected function mapWebRoutes()
  70.  
  71. {
  72.  
  73. Route::middleware('web')
  74.  
  75. ->namespace($this->namespace)
  76.  
  77. ->group(base_path('routes/web.PHP'));
  78.  
  79. }
  80.  
  81. /**
  82.  
  83. * Define the "api" routes for the application.
  84.  
  85. *
  86.  
  87. * These routes are typically stateless.
  88.  
  89. *
  90.  
  91. * @return void
  92.  
  93. */
  94.  
  95. protected function mapAuthRoutes()
  96.  
  97. {
  98.  
  99. foreach (glob(base_path('routes/api/auth/*.PHP')) as $file) {
  100.  
  101. Route::prefix('api')
  102.  
  103. ->middleware(['api','auth:api'])
  104.  
  105. ->group($file);
  106.  
  107. }
  108.  
  109. }
  110.  
  111. protected function mapGuestRoutes()
  112.  
  113. {
  114.  
  115. foreach (glob(base_path('routes/api/guest/*.PHP')) as $file) {
  116.  
  117. Route::prefix('api')
  118.  
  119. ->middleware(['api','guest:api'])
  120.  
  121. ->group($file);
  122.  
  123. }
  124.  
  125. }
  126.  
  127. protected function mapPublicRoutes()
  128.  
  129. {
  130.  
  131. foreach (glob(base_path('routes/api/public/*.PHP')) as $file) {
  132.  
  133. Route::prefix('api')
  134.  
  135. ->middleware('api')
  136.  
  137. ->group($file);
  138.  
  139. }
  140.  
  141. }
  142.  
  143. }

  

现在,无论何时我们创建一个新文件,foreach 都将找到它,因为它是使用正则匹配(该文件位于对应的路径下,并且具有 PHP 扩展名,因此它与我们的正则匹配)。简直太骚了!但是请稍等片刻。

这些文件将如何注册

如果您研究过 laravel 的生命周期,您就知道服务提供者是 laravel 请求的生命周期的一部分,我们可以利用此功能动态注册我们的路线。

就是这样!我希望您喜欢它。

译文地址:

以上就是一种颗粒度很小的 Laravel 路由文件划分方式

更多学习内容请访问:

腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

 

猜你在找的Laravel相关文章