【问题标题】:Can I group multiple domains in a routing group in Laravel?我可以在 Laravel 的路由组中对多个域进行分组吗?
【发布时间】:2013-09-07 08:09:51
【问题描述】:

假设我有以下内容:

Route::group(array('domain' => array('admin.example.com')), function()
{
    ...
});

Route::group(array('domain' => array('app.example.com')), function()
{
    ...
});

Route::group(array('domain' => array('dev.app.example.com')), function()
{
    ...
});

有没有办法让多个域共享一个路由组?比如:

Route::group(array('domain' => array('dev.app.example.com','app.example.com')), function()
{
    ...
});

【问题讨论】:

    标签: php laravel routing laravel-routing


    【解决方案1】:

    Laravel 似乎不支持这个。

    我不确定为什么我没有早点想到这一点,但我想一种解决方案是在单独的函数中声明路由并将其传递给两个路由组。

    Route::group(array('domain' => 'admin.example.com'), function()
    {
        ...
    });
    
    $appRoutes = function() {
        Route::get('/',function(){
            ...
        }); 
    };
    
    Route::group(array('domain' => 'app.example.com'), $appRoutes);
    Route::group(array('domain' => 'dev.app.example.com'), $appRoutes);
    

    我不确定此解决方案是否会对性能产生重大影响。

    【讨论】:

    • 谢谢。我认为这对性能没有影响,因为您只是将它存储在一个数组变量中并将其填充到 2 声明中。干杯!
    • 这真的适用于php artisan route:cache吗? laravel.com/docs/5.8/controllers#route-caching “基于闭包的路由无法被缓存。要使用路由缓存,您必须将任何闭包路由转换为控制器类。”
    • 我不确定@Fredrik,但那句话可能是指实际的路线实施,而不是路线的建设。在我上面的例子中,如果Route::get 引用了一个控制器方法,它可能是可缓存的。
    【解决方案2】:

    Laravel 5.1

    Route::pattern('subdomain', '(dev.app|app)'); Route::group(['domain' => '{subdomain}.example.com'], function () { ... }); Route::pattern('subdomain', '(dev.app|app)'); Route::pattern('domain', '(example.com|example.dev)'); Route::group(['domain' => '{subdomain}.{domain}'], function () { ... });

    【讨论】:

    • 这是一个很棒的提示。但是请注意,域参数将作为任何子路由的第一个参数传递:Route::get('users/{id}', 'UsersController@show'); // id = "example.com"; 为避免这种情况,您始终可以使用环境变量:$domain = env('BASE_DOMAIN', 'example.com'); Route::group(['domain' => 'subdomain.'.$domain], function() { ... });
    【解决方案3】:

    您也可以传递域名:

    Route::pattern('domain', '(domain1.develop|domain2.develop|domain.com)');
    Route::group(['domain' => '{domain}'], function() {
        Route::get('/', function($domain) {
            return 'This is the page for ' . $domain . '!';
        });
    });
    

    以防万一您需要知道调用控制器的域名。 用 Laravel 5.6 测试过。

    【讨论】:

      【解决方案4】:

      对此也感兴趣!我正在尝试为一个控制器操作注册一个本地开发 + 生产子域路由。

      # Local Dev
      Route::group(array('domain' => "{subdomain}.app.dev"), function() {
          Route::get('/{id}', 'SomeController@getShow');
      });
      
      # Production Server
      Route::group(array('domain' => "{subdomain}.app.com"), function() {
          Route::get('/{id}', 'SomeController@getShow');
      });
      

      我试过了:

      # Failed
      Route::group(array('domain' => "{account}.app.{top_level_domain}"), function() {
          Route::get('/{id}', 'SomeController@getShow');
      });
      

      但它失败了。

      不是一个大问题,正如 DesignerGuy 提到的,我可以将一个函数传递给两条路线 - 但如果它们可以分组会更优雅:)

      【讨论】:

      • 我正在尝试解决类似的问题。即,在生产中拥有“ui.domain.com”和“api.domain.com”,但允许我的开发团队在本地开发中拥有“ui.domain.local”和“api.domain.local”环境。在子域之后支持通配符就可以了。我要解决的基本问题是解决冲突的路线。例如 ui.domain.com/messages 应该返回 HTML,而 api.domain.com/messages 应该返回 JSON。因此,具有 'domain' => 'api.(:any)' 和 'domain' => 'ui.(:any)' 的两个组将是理想的
      【解决方案5】:

      签入laravel docs,如果你的主域是myapp,生产环境是myapp.com,本地环境是myapp.dev,尝试使用*

      Route::group(array('domain' => '{subdomain}.myapp.*'), 
      function()
      {
          ...
      });
      

      【讨论】:

        【解决方案6】:

        根据laravel document 在 laravel 5.4+ 中你可以这样使用:

        Route::domain('{account}.myapp.com')->group(function () {
            Route::get('user/{id}', function ($account, $id) {
                //
            });
        });
        

        【讨论】:

          【解决方案7】:

          目前你不能。我有同样的问题';我的解决方法是使用 foreach 循环遍历您的子域并注册路由。

          【讨论】:

            【解决方案8】:

            在关于同一主题的 Laravel 讨论中找到更好的答案是使用宏。这对我很有效。 https://github.com/laravel/framework/issues/4017#issuecomment-267820459

            Route::macro("domain", function(array $domains, \Closure $definition) {
                foreach ($domains as $domain) {
                    Route::group(['domain' => $domain], $definition);
                }
            });
            
            Route::domain(['foo.bar.dev', 'foo.bar'], function($route) {
                // Do stuff
            });
            

            【讨论】:

            【解决方案9】:

            查看此链接。 http://laravel.com/docs/routing#sub-domain-routing

            Route::group(array('domain' => '{subdomain}.example.com'), function()
            {
                ...
            });
            

            或者使用这个包。

            https://github.com/jasonlewis/enhanced-router

            它可以帮助您像这样设置组路由的位置。

            Route::group(array('domain' => '{maindomain}'), function()
            {
                ...
            })->where('maindomain', '.+\.example\.com$');
            

            【讨论】:

            • 这不起作用 Route::group(array('domain' => '{maindomain}'), function() { ... })->where('maindomain', '.+\.example\.com$');
            猜你喜欢
            • 2018-02-10
            • 1970-01-01
            • 2019-10-09
            • 1970-01-01
            • 2021-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-25
            相关资源
            最近更新 更多