【问题标题】:Allow multiple subdomain in laravel without making subdomain as route variable?允许laravel中的多个子域而不将子域作为路由变量?
【发布时间】:2016-09-18 12:05:11
【问题描述】:

我的子域是

domain1 = dev1.myapp.com,
domain2 = dev2.myapp.com,
domain3 = dev3.myapp.com
...

使用下面的代码导致 laravel 控制器中的第一个参数出现问题,

> Route::group(array('domain' => '{account}.myapp.com'), function() {
> Route::get('/get_data/{id?}', 'DataController@getData');
> })

我在 getData 方法中的控制器中获取子域值(dev1,dev2,dev3)而不是 $id value

如何更新我的代码以允许所有子域,而不将子域作为每个控制器方法中的第一个参数。

请分享你的想法。

【问题讨论】:

  • 确保您已将 {account} 与您的模型绑定。
  • @RifkiAriaGumelar : 你的意思是控制器的方法getData ?
  • 我在任何地方都不需要$account,所以我需要包含在所有子路由中吗?
  • 让我们说得更清楚些,您是否想根据用户 ID 获取子域,例如 1.myapp.com
  • @RifkiAriaGumelar,就像dev1.myapp.com/get_data/1dev2.myapp.com/get_data/1

标签: php laravel subdomain laravel-5.2 laravel-routing


【解决方案1】:

由于您不想在控制器方法中使用{account} 变量,您可以在变量中定义路由并将其传递给您的每个子域组,示例如下:

$subdomainRoutes = function () {
    Route::get('get_data/{id?}', function ($id) {
        //
    });
};

Route::group(['domain' => 'dev1.myapp.com'], $subdomainRoutes);
Route::group(['domain' => 'dev2.myapp.com'], $subdomainRoutes);
Route::group(['domain' => 'dev3.myapp.com'], $subdomainRoutes);

编辑

如果您的子域是动态的,那么您可以使用middleware,创建一个类似的中间件:

namespace App\Http\Middleware;

use Closure;

class SubDomainAccess
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $server = explode('.', $request->server('HTTP_HOST'));
        $subdomain = $server[0];

        // check if sub domain exists, replace with your own conditional check
        if (! Account::where('slug', $subdomain)->first()) {
            return abort(404); // or redirect to your homepage route.
        }

        return $next($request);
    }
}

Kernel.php注册您的middleware

'subdomain' => \App\Http\Middleware\SubDomainAccess::class,

然后在你的routes.php上使用它

Route::group(['middleware' => 'subdomain'],  function () {
    Route::get('/get_data/{id?}', 'DataController@getData');
});

【讨论】:

  • dev1, dev2 & dev3 都是动态的,以后还会有更多这样的账户。
猜你喜欢
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2016-03-29
  • 1970-01-01
  • 2011-11-18
  • 2020-01-04
相关资源
最近更新 更多