2016-05-31 7 views
2

Bindungen

Ich Bindungen in meinen Service-Provider zwischen Schnittstelle und Implementierung mit:Access Request in Service-Provider nach dem Anwenden von Middleware

public function register() 
{ 
    $this->app->bind('MyInterface', MyImplementation::class); 
} 

Middleware

In meiner Middleware, füge ich ein Attribut zur Anfrage:

public function handle($request, Closure $next) 
{ 
    $request->attributes->add(['foo' => 'bar]); 
    return $next($request); 
} 

Jetzt möchte ich auf 012 zugreifenin meinem Dienstleister

public function register() 
{ 
    $this->app->bind('MyInterface', new MyImplementation($this->request->attributes->get('foo')); // Request is not available 
} 

Das Register() wird vor dem Aufbringen der Middleware genannt. Ich kenne.

Ich bin auf der Suche nach einer Technik zu 'binden', wenn die Anfrage-> Attributen-> get ('foo') gesetzt ist

+1

Aber ist das nicht generell eine schlechte Übung? Das Starten von SPs ist ein Teil des Bootstrap-Prozesses, die Verarbeitung einer Anfrage erfolgt später. Es klingt etwas peinlich - Ändern des Boot-Prozesses auf Anfrage. Sollten Sie Ihr Problem nicht anders lösen? –

+0

Ja, du hast vollkommen recht. Aber jetzt muss ich konkrete Implementierungen instanziieren, die nicht gut wartbar sind. – schellingerht

+0

Warum? Sie könnten eine andere Implementierung an die Schnittstelle in Ihrer Middleware binden, basierend auf den Parametern $ request –

Antwort

8

wie diese versuchen:

public function register() 
{ 
    $this->app->bind('MyInterface', function() { 
     $request = app(\Illuminate\Http\Request::class); 

     return app(MyImplementation::class, [$request->foo]); 
    } 
} 

Bindungselemente funktioniert wie dass sie nur ausgelöst werden, wenn sie angerufen werden.

+0

Danke! Du meinst abgehoben? – schellingerht

+0

Genau ich meine abgelöst. –

+0

Hat es dein Problem gelöst? –