Laravel 5,子域路由,带可选参数

Posted

技术标签:

【中文标题】Laravel 5,子域路由,带可选参数【英文标题】:Laravel 5, Sub-Domain routing, with optional parameter 【发布时间】: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 他会得到什么语言的英文版或具有不同显示的自定义网站 【参考方案1】:

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

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

所以代码看起来像

Route::group(['domain' => 'domainexample.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

【讨论】:

这不是回答关于如何接受没有子域的路由的问题

以上是关于Laravel 5,子域路由,带可选参数的主要内容,如果未能解决你的问题,请参考以下文章

Laravel (5) - 使用可选参数路由到控制器

Laravel 路由可选参数到控制器

原来 laravel 路由 参数可以为可选。。。 很灵活

带有可选参数和 ajax 调用的 Laravel 路由

Laravel 4:如何传递多个可选参数

Laravel 8:如何使隐式模型绑定路由参数可选而不是抛出 404?