2016-07-31 88 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是會幫助你的。