Laravel:基于环境变量在routes.php中实现动态路由的最佳方法是什么?

时间:2016-12-31 08:57:13

标签: laravel laravel-5

我的目标是为Laravel v5项目推出一个重大的重新设置/重新换肤(包括新的URL路由),而不用触及现有的业务逻辑(尽可能多)

这是我目前的做法:

  1. 我在APP_SKIN=v2文件中放置了.env条目

  2. 我的app\Http\routes.php文件已更改如下:

    if (env('APP_SKIN') === "v2") {
    
        # Point to the v2 controllers
        Route::get('/', 'v2\GeneralController@home' );
        ... all other v2 controllers here ...
    
    } else {
    
        # Point to the original controllers
        Route::get('/', 'GeneralController@home' );
        ... all other controllers
    
    }
    
  3. 所有v2控制器都已放置在app/Http/Controllers/v2并相应地命名空间

  4. 所有v2刀片模板均已放置在resources/views/v2
  5. 其余的业务逻辑保持完全相同,并在“皮肤”之间共享。
  6. 我的问题:是否有“更好”的方法来实现上述目标?。请注意,这里的想法是在进行迁移时尽可能少地影响文件,并确保管理员可以简单地更改环境变量,并在出现问题时“回滚”到上一个皮肤。

2 个答案:

答案 0 :(得分:1)

在app / Providers / RouteServiceProvider.php中,你可以定义你的路由和命名空间等。这就是我要把你谈到的逻辑放在哪里(而不是在路由文件中):

protected function mapWebRoutes()
{
    if (App::env('APP_SKIN') === 'v2') {
        Route::group([
            'middleware' => 'web',
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/web_v2.php');
        });
    } else {
        // ...
    }
}

这样,您可以创建单独的路径文件,使其更清晰。

除此之外,我个人看不到比你描述的更好的解决方案,因为我猜你的模板想要改变他们提供的数据,如果是这样,那么你将需要新控制器 - 否则您可以在中间件中设置一个变量,然后由当前控制器检索,然后可以确定包含哪些视图,css和js。这意味着您只需要更新现有的控制器,但这取决于您当前的代码 - 这可能意味着您可以完成与当前解决方案一样多的工作。

答案 1 :(得分:0)

路由通过中间件。因此,您可以通过BeforeMiddleware实现此目的,如下所示

public function handle($request, Closure $next)
{
  // Get path and append v2 if env is v2
  $path = $request->path();
  $page = $str = str_replace('', '', $path); // You can replace if neccesary

  // Before middleware
  if (env('APP_SKIN') === "v2")
  {
      return $next($request);  
  }
  else
  {
  }
}