2016-07-31 55 views
0

我的应用程序应该具有管理员,成员和公共区域,从admin.mydomain.com,members.mydomain.com和www.mydomain.com映射。文件包含有关子域路由下面的例子:Laravel 5路由:admin,成员,公共

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

但我不想硬编码或使用其他方式的二级域名路由(myapp.com在这个例子中)。所以,我提出这样说:

Route::pattern('domain', '.+\..+'); 
Route::group(['namespace' => 'Admin', 'domain' => 'admin.{domain}', 'middleware' => 'auth'], 
    function() { 
    Route::get('/edit/{id}/{name}', '[email protected]'); 
}); 

然后,我做出像

class MyController extends Controller 
{ 
    function index($id, $name) { 
     dd($id); 
    } 
} 

控制器,当我浏览admin.mydomain.com/edit/1/alex,我得到的输出为“admin”。 当然,这是因为我使用{domain}作为模式。但我不想在所有管理员控制器的每个操作中都接收域作为第一个参数。请帮助我做正确的方式。

+0

我没有亲自尝试过,但你应该能够在控制器和请求本身之间放置一个中间件。除非您特别希望将它传递给某些/所有控制器,否则您不会将第一个参数作为控制器中的子域。 – Andrew

回答

0

一个想法是创建一个中间件,将删除该domain参数:

namespace App\Http\Middleware; 
use Closure; 
class RemoveDomainMiddleware { 

    public function handle($request, Closure $next) { 

    $request->route()->forgetParameter('domain'); 

    return $next($request); 
    } 
} 

然后确保你的寄存器中的中间件app/Http/Kernel.php

protected $routeMiddleware = [ 
    //...... 
    'domain' => \App\Http\Middleware\RemoveDomainMiddleware::class, 
    //..... 
]; 

最后,中间件添加到您的组:

Route::group([ 'middleware' => ['domain', 'auth'], 'namespace' => 'Admin', 'domain' => 'admin.{domain}'], 
    //..... 
}); 

我希望th是会帮助你的。