laravel路由自动加载

laravel路由自动加载

laravel 自带的路由文件有四个

  • api.php 文件存放 api 路由,会自动加载api前缀和一些中间件。
  • channels.php 文件用于注册应用支持的所有事件广播频道。
  • console.php 文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行 IO 方法进行交互,尽管这个文件并不定义 HTTP 路由,但是它定义了基于控制台的应用入口(路由)。
  • web.php 如果应用无需提供无状态的、RESTful 风格的 API,那么路由基本上都要定义在 web.php 文件中。会自动加载web中间件。

我们常用的无非是api和web路由,一开始我们可以都写在里面,那当程序不断扩大,路由达到几千个,几万个甚至更多,放在一个文件里显示难以维护,难以查找。

这时候我们需要把路由分到不同的路由文件中去,我们在routes目录下创建api文件夹,来存放相关的api路由。

这时候我们自己创建的路由文件是不被框架认可的,不被加载的。那我们怎么做呢,最简单的方法是加载到api.php路由文件内。

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

require base_path('routes/api/user.php');  //加载api文件夹下的用户路由

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});



但是这样的方式有着很大的缺点,难道我们每增加一个路由文件,都要修改这个api.php文件嘛?

我们还有更好的方式,在laravel中,服务提供者是一个很重要的模块,其实这里的所有路由都是通过RouteServiceProvider.php这个服务提供者来加载的。所以我们只需要更改这个服务提供者就可以了。

这里面有一个mapApiRoutes函数来加载api路由,我们可以写一个函数requireRoutes来加载我们自己创建的路由。然后在mapApiRoutes函数里面调用。

 /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')     //前缀
            ->middleware('api')  //中间件
            ->namespace($this->namespace)  //命名空间
            ->group(base_path('routes/api.php'));

        $this->requireRoutes('routes/Api');
    }

    /**
     * 遍历文件夹
     */
    private function requireRoutes($path) {
        $dirs = scandir(base_path($path));
        foreach ($dirs as $dir) {
            if (is_dir(base_path($path.'/'.$dir))) {
                if($dir=='.' || $dir=='..'){//判断是否为系统隐藏的文件.和..  如果是则跳过否则就继续往下走,防止无限循环再这里。
                    continue;
                }
                $this->requireRoutes($path.'/'.$dir);
            } else {
                //文件,加载进来
                Route::prefix('api')
                ->middleware('api')
                ->middleware('jwtCheck')
                ->namespace($this->namespace)
                ->group(base_path($path.'/'.$dir));
            }
        }
    }
发布了30 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Thepatterraining/article/details/105386868