2015-05-11 32 views
8

Podczas gdy building multi-tenancy packages for Laravel 5 musiałem dowiedzieć się, jak dynamicznie dodawać oprogramowanie pośrednie z kodu. W porównaniu z this question on SO nie chcę dotykać definicji Http/Kernel.Dynamiczne oprogramowanie pośrednie dla laravel 5

Podczas inicjowania aplikacji sprawdzam, czy żądana nazwa hosta jest znana w bazie danych i czy ta nazwa hosta wymaga przekierowania na podstawową nazwę hosta lub ssl.

Ponieważ nie chcesz dotykać Http/Kernel jako paczki, musimy skorzystać z usługodawcy.

Wymagania:

  • dynamicznie dodawać middleware bez dotykania HTTP/Kernel
  • usługodawcy wykorzystanie i odpowiedzi obiekt zamiast "hacków"

Odpowiedz

3

Rozwiązaniem jest dynamicznie zarejestrować pośredniczące w jądro. Najpierw napisać oprogramowanie warstwy pośredniej, na przykład:

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

teraz w Twoich service provider użyć następującego kodu w metodzie boot() aby dodać middleware do jądra:

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

Aby odpowiedzieć co redirectActionRequired() metoda działa w nazwa hosta obiekt:

/** 
* 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; 
} 

Jeśli potrzebujesz dynamicznie zarejestrować trasęMiddleware użyj w swoim s dostawca usług;

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

Proszę dodać komentarze, jeśli masz pytania dotyczące tej implementacji.

Powiązane problemy