【问题标题】:Laravel domain routing in production and dev生产和开发中的 Laravel 域路由
【发布时间】:2016-05-02 04:42:53
【问题描述】:

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

我的本​​地 .env 文件具有变量 APP_ENV=local,而我在 forge 上的 .env 具有变量 APP_ENV=production。到目前为止,一切顺利。

我遇到的问题是,我希望 Laravel 能够基于我在本地运行(扩展名为 .app)或生产环境(扩展名为 .com)使用这种类型的通配符路由规则:

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

});

我遇到的问题是 Laravel、Ngnix、AWS 或 Forge 都要求我像这样显式路由,这似乎完全是多余的:

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

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

    });

}

或者也许我的期望是错误的;)非常感谢任何关于我可能做错的指针!

【问题讨论】:

    标签: php laravel laravel-routing


    【解决方案1】:

    真正简单的解决方案是使用三元运算符来确定 TLD 并在组的 domain 属性中使用它:

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

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

    【讨论】:

    • 我喜欢这个,并尝试过,但显然 Laravel 不喜欢像这样动态组装域属性。我不敢相信我必须在 Laravel 中一起破解一些东西来解释 TLD。哎呀。
    • @Gunnar 这种方法有效,我过去自己也使用过,但答案中的代码存在一个小问题。我已经更新它以将 TLD 表达式包装在括号中,否则字符串连接无法正常工作,因为算术运算符如 .have precedence 超过三元运算符 ?:,所以在评估时它尝试将字符串与truefalse 条件的结果连接,而不是comapp 表达式的结果。
    【解决方案2】:

    路由参数{} 而不是* 也会发生同样的事情吗?我不确定 laravel 路由是否支持 *:

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

    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(){
    
    });
    

    【讨论】:

    • 第二种解决方案很好。然而,当路由有自己的参数时,第一个肯定会造成混乱。因为如果你有一个像Route::get('user/{name}', 'UsersController@show'); 这样的路由定义,action 方法会收到两个参数show($tld, $name),所以所有有自己参数的路由动作最终都需要添加额外的$tld 参数。
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2021-07-09
    • 2017-11-17
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多