2015-05-11 27 views
8

雖然building multi-tenancy packages for Laravel 5我必須找出如何從代碼動態添加中間件。與this question on SO相比,我不想觸及Http/Kernel定義。laravel的動態中間件5

在應用程序初始化期間,我檢查請求的主機名是否在數據庫中是已知的,以及該主機名是否需要重定向到主主機名或ssl。

由於您不想將Http/Kernel作爲包裝進行操作,因此我們需要使用服務提供商。

要求:

  • 動態添加中間件不接觸,而不是「黑客」

回答

3

解決方案是將動態註冊在中間件HTTP /內核

  • 使用服務提供者和響應對象核心。先寫你的中間件,例如:

    <?php namespace HynMe\MultiTenant\Middleware; 
    
    use App; 
    use Closure; 
    use Illuminate\Contracts\Routing\Middleware; 
    
    class HostnameMiddleware implements Middleware 
    { 
        public function handle($request, Closure $next) 
        { 
         /* @var \HynMe\MultiTenant\Models\Hostname */ 
         $hostname = App::make('HynMe\Tenant\Hostname'); 
         if(!is_null($redirect = $hostname->redirectActionRequired())) 
          return $redirect; 
    
         return $next($request); 
        } 
    } 
    

    現在你service provider使用下面的代碼boot()方法這個中間件添加到內核:

    $this->app->make('Illuminate\Contracts\Http\Kernel')->prependMiddleware('HynMe\MultiTenant\Middleware\HostnameMiddleware'); 
    

    要回答什麼redirectActionRequired()方法做的主機名對象:

    /** 
    * Identifies whether a redirect is required for this hostname 
    * @return \Illuminate\Http\RedirectResponse|null 
    */ 
    public function redirectActionRequired() 
    { 
        // force to new hostname 
        if($this->redirect_to) 
         return $this->redirectToHostname->redirectActionRequired(); 
        // @todo also add ssl check once ssl certificates are support 
        if($this->prefer_https && !Request::secure()) 
         return redirect()->secure(Request::path()); 
    
        // if default hostname is loaded and this is not the default hostname 
        if(Request::getHttpHost() != $this->hostname) 
         return redirect()->away("http://{$this->hostname}/" . (Request::path() == '/' ? null : Request::path())); 
    
        return null; 
    } 
    

    如果您需要動態註冊routeMiddleware使用你的S以下服務提供者;

    $this->app['router']->middleware('shortname', Vendor\Some\Class::class); 
    

    如果對此實施有疑問,請添加評論。