2016-03-23 4 views
1

Ich habe eine Klasse, die für das Anrufen einer Zahlungslösung von Drittanbietern reaktionsfähig ist.Wie kann ich Parameter über den Service Container an die Konstruktoren übergeben?

Als Teil davon gibt es verschiedene Händler-ID/Shared-Secret-Parameter. Thesen hängen davon ab, wer in der Anwendung angemeldet ist.

Die Klasse, mit der ich arbeite, übernimmt diese Information im Konstruktor, wenn die Klasse erstellt wird. Gibt es eine Möglichkeit, dies im Service-Provider passieren, vielleicht so:

$this->app->bind('App\BokaKanot\Interfaces\BillingInterface',function ($merchantId) 
{ 
    return new KlarnaBilling($merchantId); 
}); 

Wenn ja, ist es immer noch möglich, dies durch einen Konstruktor zu tun oder muss ich manaully App:make verwenden. Wenn ich App::make verwenden muss, wie kann ich das nicht in meiner Aufrufklasse verstecken?

Oder sollte ich die Klasse umgestalten, die ich benutze, um dies nicht im Konstruktor zu benötigen, und vielleicht eine Init-Methode?

Antwort

2

Sie können Parameter App::make passieren und die Parameter an den Konstruktor wie folgt passieren:

$this->app->bind('App\BokaKanot\Interfaces\BillingInterface', 
        function($app, array $parameters) 
{ 
    //call the constructor passing the first element of $parameters 
    return new KlarnaBilling($parameters[0]); 
}); 

//pass the parameter to App::Make 
App::make('App\BokaKanot\Interfaces\BillingInterface', [ $merchantId ] ); 
+0

Dank für die Arbeit! Ich kann die App setzen: make in meinem Controller, und dann nach einer Instanz davon in einer Methode unten fragen, aber gibt es eine Möglichkeit, die ich als Parameter im Konstruktor bekommen und instanzieren kann? Wenn ja wo soll ich die App machen: machen? In der router.php? – iKode

+0

@iKode: Entschuldigung, aber ich verstehe deine Frage nicht. Könnten Sie ein konkretes Beispiel dafür geben, was Sie erreichen möchten, indem Sie Ihre Frage bearbeiten? – Moppo

2

Auf Laravel 5.4 (https://github.com/laravel/framework/pull/18271), müssen Sie die Methode make des IoC-Container verwenden.

App::makeWith('App\MyNameSpace\MyClass', [ $id ] ); 

wenn Sie noch 5.3 oder unten verwenden, werden die oben genannten Antworten

+0

in Laravel 5.5, können Sie immer noch make ('Class', $ Daten) verwenden, ich denke, die Methode ist zurück –

Verwandte Themen