2016-01-25 29 views
3

我有一个工作的Laravel 5.2项目,使用本地运行(宅基地)和生产(在AWS上配置通配符子域路由的伪造的子域路由)。我的本地项目有一个admin.project.app主机文件条目,并成功路由到admin.project。 应用程序而我的生产版本路由到admin.project。 com在生产和开发中的Laravel域路由

我的本地.env文件具有变量APP_ENV = local,而我的.env ongege具有变量APP_ENV = production。到现在为止还挺好。

我遇到的问题是,我期望Laravel基于我在本地运行(扩展名为.app)或生产(使用.com的扩展名)使用此类型来解析域通配符路由规则:

Route::group(['domain' => 'admin.project.*'], function() 
{ 
    Route::get('/', '[email protected]'); 

}); 

我遇到的问题是,要么Laravel,Ngnix,AWS,或伪造的,要求我明确的路线是这样,这似乎完全是多余的:

if (App::environment('local')) { 
    Route::group(['domain' => 'admin.project.app'], function() 
    { 
     Route::get('/', '[email protected]'); 

    }); 
}else{ 
    Route::group(['domain' => 'admin.project.com'], function() 
    { 
     Route::get('/', '[email protected]'); 

    }); 

} 

或者也许我的期望是错的;)任何指针a对我可能做错的事感到非常感激!

回答

2

同样的事情发生与路线参数{}而不是*?我不知道该laravel路由支持*:

Route::group(['domain' => 'admin.project.{tld}'], function() 
{ 
    Route::get('/', '[email protected]'); 
}); 

https://laravel.com/docs/5.2/routing#route-group-sub-domain-routing

或者,如果你只是使用的域作为ENV变量?在本地您的ENV文件,添加:

APP_DOMAIN=admin.project.app

然后在路由文件:

Route::group(['domain' => env("APP_DOMAIN","admin.project.com")],function(){ 

}); 
+2

第二种解决方案是一个很好的解决方案。然而,当路线有自己的参数时,第一个肯定会造成混乱。因为如果你有一个像这样的Route :: get('user/{name}','UsersController @ show');',action方法将接收两个参数'show($ tld,$ name)',所以具有自己的参数的所有路由动作最终都需要添加额外的'$ tld'参数。 – Bogdan

3

将很容易的解决办法是使用三元运算符来确定TLD并使用,在集团domain属性:

Route::group(['domain' => 'admin.project.' . ((env('APP_ENV') == 'production') ? 'com' : 'app')], function() 
{ 
    Route::get('/', '[email protected]'); 
}); 

避免重复的代码,并添加额外的环境变量。

+0

我喜欢这一点,并尝试过,但显然Laravel不喜欢像这样在飞行中组装域属性。我不敢相信我必须在Laravel一起破解一些东西来解释TLD。育。 – Gunnar

+0

@Gunnar这种方法很有效,过去我自己用过,但答案中的代码存在一个小问题。我已经更新它来将TLD表达式包装在圆括号中,否则字符串连接将无法正常工作,因为算术运算符(例如'.' [有优先顺序](http://bit.ly/1BPqFi3)的三元运算符' ?和':',所以在评估时试图将字符串与条件结果“true”或“false”连接起来,而不是表达式的结果是“com”或“app”。 – Bogdan

+0

这工作 - 谢谢你! – Gunnar