2015-05-11 36 views
8

building multi-tenancy packages for Laravel 5 Ancak, ara katman yazılımını dinamik olarak koddan nasıl ekleyeceğimi bulmalıydım. this question on SO ile karşılaştırıldığında Http/Kernel tanımlarına dokunmak istemiyorum.Labirent için dinamik ara katman 5

Uygulama başlatma sırasında, istenen ana makine adının veritabanında bilinip bilinmediğini ve bu ana makine adının birincil ana makine adı veya ssl'ye bir yönlendirme gerektirip gerektirmediğini kontrol ediyorum.

Http/Kernel ürününe paket olarak erişmek istemediğinizden, servis sağlayıcısını kullanmamız gerekir.

Gereksinimler:

  • dinamik yerine "kesmek"

cevap

3

çözüm dinamik ara katman kayıt etmek Http/Çekirdek

  • kullanım servis sağlayıcı ve yanıt nesnesi dokunmadan orta katman eklemek çekirdek. İlk mesela senin ortakatmanını yazın:

    Şimdi
    <?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); 
        } 
    } 
    

    senin service provider Çekirdeği'ne bu ara katman eklemek için boot() yöntemde şu kodu kullanın:

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

    redirectActionRequired() yöntem ne yaptığını cevaplamak için hostname nesnesi: dinamik kayıt gerekiyorsa

    /** 
    * 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 sizin s aşağıdakileri kullanabilirsiniz hizmet sağlayıcı;

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

    Lütfen bu uygulama hakkında sorularınız varsa yorum ekleyin.

  • İlgili konular