2015-05-11 24 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); 
    

    如果对此实施有疑问,请添加评论。