2015-05-11 15 views
8

Mentre building multi-tenancy packages for Laravel 5 ho dovuto scoprire come aggiungere il middleware in modo dinamico dal codice. In confronto a this question on SO non voglio toccare le definizioni di Http/Kernel.Middleware dinamico per laravel 5

Durante l'inizializzazione dell'applicazione, controllo se il nome host richiesto è noto nel database e se questo nome host richiede un reindirizzamento a un nome host o ssl primario.

Poiché non si desidera toccare lo Http/Kernel come pacchetto, è necessario utilizzare il provider di servizi.

Requisiti:

  • aggiungere dinamicamente middleware senza toccare Http/Kernel
  • provider di servizi l'uso e la risposta oggetto invece di "hack"

risposta

3

La soluzione è quella di registrare dinamicamente il middleware nel kernel. In primo luogo scrivere il middleware, per esempio:

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

Ora nel tuo service provider utilizzare il seguente codice nel metodo boot() per aggiungere questo middleware per il kernel:

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

Per rispondere a ciò che redirectActionRequired() metodo fa in hostname object:

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

Se è necessario registrare dinamicamente routeMiddleware, utilizzare quanto segue nella s fornitore di servizi;

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

Aggiungi commenti se hai domande su questa implementazione.