【问题标题】:Laravel 5, Sub-Domain routing, with optional parameterLaravel 5,子域路由,带可选参数
【发布时间】:2015-11-17 05:50:40
【问题描述】:

我刚开始学习 Laravel 5 并尝试创建多语言网站,并希望为该语言使用不同的域,因此 en.example.app 指向英语版本,es.example.app 指向西班牙语等等。我使用路由组,下面是我的代码。

Route::group(['domain' => '{domain}.example.app'], function() {
    Route::get('/', function () {
        return view('index');
    });
    Route::get('test', function(){
        return view('index');
    });
});

它适用于除 example.app 之外的所有域。不幸的是,可选参数 {domain?} 不适用于子域,我不想像这样复制路由。

Route::get('/', function () {
    return view('index');
});
Route::get('test', function(){
    return view('index');
});

Route::group(['domain' => '{domain}.example.app'], function() {
    Route::get('/', function () {
        return view('index');
    });
    Route::get('test', function(){
        return view('index');
    });
});

有人可以建议如何避免这种重复吗?

【问题讨论】:

  • 如果用户访问 example.app 他会得到什么语言的英文版或具有不同显示的自定义网站

标签: php laravel laravel-5 laravel-routing laravel-5.1


【解决方案1】:

这是因为{domain}.example.app 需要.example.app 之前。

您可以删除. 并为domain 参数添加约束,使其最多具有1 个.

所以代码看起来像

Route::group(['domain' => '{domain}example.app'], function($group) {
    Route::get('/', function ($domain) {
        //code
    }) ;
    // more routes

    foreach($group->getRoutes() as $route){
        $route->where('domain', '[a-z]+\.{0,1}');
    }

});

附: : 我不知道我的正则表达式是否正确。

【讨论】:

    【解决方案2】:

    您可以创建一个名为 app-routes.php 的文件,其中包含您的所有路线,然后在您的实际 routes.php 文件中

    Route::group(['domain' => '{domain}.example.app'], function() {
        include('app-routes.php');
    }); 
    
    Route::group(['domain' => 'example.app'], function() {
        include('app-routes.php');
    }); 
    

    【讨论】:

    • 很好 1,但你试过了吗?如何将域设置为某个常量?
    • 我试过了,但我无法从 example.app 正确链接到 subdomain.example.app... 对此有什么想法吗? @j-戴维斯。我试过这个 {{URL::route('home', array('subdomain' => 'johndoe'))}}
    【解决方案3】:

    一个 MiddleWare 帮助了我。

    Route::group(array('middleware' => 'resolve_domain'), function () {
        Route::get('/', 'WhitePapersController@getHomepage');
    });
    

    而在 MiddleWare -

    public function handle($request, Closure $next)
    {
        $params = explode('.', $request->getHost());
        $sub_domains = config('admin_configs.editions'); // Predefined sub-domain
        $edition = false;
        if(!empty($params[0]) && in_array($params[0], $sub_domains, true))  {
            $edition = $params[0];
        }
        define('DOMAIN_EDITION', $edition); // Set constant to be used.
    
        return $next($request);
    }
    

    【讨论】:

      【解决方案4】:

      对于没有子域的 HTTP 请求,您的选择是路由复制或服务器级重定向。

      简单的选择是将example.app 转发到www.example.app

      【讨论】:

        【解决方案5】:
        Route::group(['domain' => '{domain}.example.app'], function() {
        
        }); 
        
        Route::group(['domain' => 'example.app'], function() {
        
        }); 
        

        这个模式很好,但是如果你想使用不同的语言添加本地化文件

        【讨论】:

          【解决方案6】:

          要在你的路由函数中使用域参数,你需要像这样传递它:

          Route::group(['domain' => '{domain}.example.app'], function() {
          
              Route::get('/', function ($domain) {
                  // do something
              });
          
          });
          

          这里的文档中有介绍 - http://laravel.com/docs/5.1/routing#route-group-sub-domain-routing

          【讨论】:

          • 这不是回答关于如何接受没有子域的路由的问题
          猜你喜欢
          • 2015-09-10
          • 2016-06-26
          • 2017-09-30
          • 2018-04-06
          • 2015-02-05
          • 1970-01-01
          • 2015-04-17
          • 1970-01-01
          相关资源
          最近更新 更多