zoukankan      html  css  js  c++  java
  • laravel 中间件及路由分离

    $middleware 属性:

    这个属性称为全局中间件,为什么说是全局中间件呢?因为你的每一次请求,这里面的每个中间件都会执行。

    $routeMiddleware 属性:

    这个属性称为路由中间件,为什么说是路由中间件呢?因为定义在该属性内的中间件,只能在定义路由时候引用

    protected $routeMiddleware = [
        ...
        'auth' => IlluminateAuthMiddlewareAuthenticate::class,
    ];
    

    如果我们要使用 IlluminateAuthMiddlewareAuthenticate::class 这个中间件该怎么做呢?

    Route::get('hello/laravel-china','XXController@index')->middleware('auth');

    我们定义路由时候调用了 middleware 方法,参数值是 auth, 这样访问这个路由的时候,就会执行该中间件。明白了吧!很简单的。

    $middlewareGroups 属性:

    这个属性称为中间件组,为什么说是中间件组呢?我们之前说了路由中间件,是不是感觉这样添加路由中间件很麻烦,比如我们执行 10 个中间件,是不是就要在定义路由时候添加 10 个呢?有了中间件组就不用这么麻烦了。我们来看下中间件组是怎么定义的。

    protected $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::class,
            ...
        ],
        'api' => [
            ...
        ],
    ];
    

      好了,上面的例子就是定义中间件组的格式,比如我们看 web 这个键值,它对应为一个数组,该数组有多个中间件组成。当我们定义好后,该怎么使用呢?
    我们在声明路由的时候,这样调用就可以了。

    Route::group(['middleware' => 'web'],function($route){
        $route->get('hello/world',function(){});
        $route->get('hello/php',function(){});
        // 这样在访问这个这些路由的时候,就会执行中间件组 web 所对应的中间件,方便多了,批量式的。
    });
    

    $middleware:全局中间件,要对所有的请求要做一些处理的时候,就适合定义在该属性内。(比如统计请求次数这些)
    $middlewareGroups:中间件组,比如我们项目有 api 请求和 web 的请求的时候,就要把两种类型的请求中间件分离开来,这时候就需要我们中间件组啦。
    $routeMiddleware:路由中间件,有些个别的请求,我们需要执行特别的中间件时,就适合定义在这属性里面。

    Laravel的路由功能很强大,默认都是定义在 routes.php 文件中,随着项目越来越大,我们需要的定义的路由越来越多,想象一下,如果几百上千个路由都定义在一个文件中,如何去维护?也许还有不同的人都在同一个文件定义路由,这就造成了冲突,因此我们需要分割 routes.php 文件

    在 app/Providers/RouteServiceProvider.php 的 map 方法中可以如下定义:

    public function map(Router $router)
    {
        $router->group(['namespace' => $this->namespace], function ($router) {
            foreach (glob(app_path('Http//Routes') . '/*.php') as $file) {
                $this->app->make('App\Http\Routes\' . basename($file, '.php'))->map($router);
            }
        });
    }
    

    这样它会遍历 app/Http/Routes/ 文件夹下的文件,遍历每个文件路由类的 map 方法,每个文件的结构都类似,举个例子:

    <?php
    
    namespace AppHttpRoutes;
    
    use IlluminateContractsRoutingRegistrar;
    
    class HomeRoutes
    {
        public function map(Registrar $router)
        {
            $router->group(['domain' => 'www.xxx.me', 'middleware' => 'web'], function ($router) {
                $router->auth();
                $router->get('/', ['as' => 'home', 'uses' => 'IndexController@index']);
                $router->get('/blog', ['as' => 'index.blog', 'uses' => 'BlogController@index']);
            });
        }
    }
    

    那么这样路由分开多个文件后岂不是增加调用次数,会不会影响性能?答案是不必担心。通过 Laravel 的命令:

    php artisan route:cache

    生成路由缓存文件后,路由只会读取缓存文件的路由规则,因此不会影响性能,这样做让开发更高效和规范。

    第二种方法

    项目appProvidersRouteServiceProvider.php
    

    在下方添加自己想要的

    public function map()
    {
        $this->mapApiRoutes();
    
        $this->mapWebRoutes();
    
        //这里随意添加自己想要的 如后台 也可以改动他原来的代码
    
         $this->mapAdminRoutes();
        
    }

    新增你添加的方法

    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }
    
       protected function mapApiRoutes()
        {
    //        Route::prefix('api')
    //             ->middleware('api')
    //             ->namespace($this->namespace)
    //             ->group(base_path('routes/api.php'));
    
            foreach (glob(base_path('routes/Api') . '/*.php') as $file) {
                Route::middleware('api')
                    ->namespace($this->namespace)
                    ->group($file);
            }
    
            /*        Route::prefix('api')
                         ->middleware('api')
                         ->namespace($this->namespace)
                         ->group(base_path('routes/api.php'));*/
        }
    
    //这是新增的
    protected function mapAdminRoutes()
        {
    //        Route::prefix('api')
    //            ->middleware('api')
    //            ->namespace($this->namespace)
    //            ->group(base_path('routes/api.php'));
    
            foreach (glob(base_path('routes/Admin') . '/*.php') as $file) {
                Route::middleware('admin')
                    ->namespace($this->namespace)
                    ->group($file);
            }
    
            /*Route::middleware('web')
                 ->namespace($this->namespace)
                 ->group(base_path('routes/web.php'));*/
        }
    

      在routes文件夹下,你就可以随意定义自己的路由了

    既不回头,何必不忘; 既然无缘,何须誓言; 今日种种,逝水无痕; 明夕何夕,君已陌路;
  • 相关阅读:
    Java程序,JDK的安装、环境的配置
    Oracle数据库,序列、索引、视图
    Oracle数据库,内置函数小结
    Oracle数据库,join多表关联方式、union结果集合并
    Oracle数据库,模糊查询、去重查询
    Oracle数据库,查询语句、内置函数
    Oracle数据库,数据的增、删、改、查
    Unity 3D-Canvas画布的三种模式
    Unity 3D-Navigation网格导航系统使用教程
    Xlua使用教程、攻略
  • 原文地址:https://www.cnblogs.com/zyjfire/p/10919313.html
Copyright © 2011-2022 走看看