1

verwenden Ich benutze Laravel 5.2 und schrieb meinen eigenen Service Provider. Ich möchte ein Request Objekt in die Register-Methode injizieren.Wie Methode Injektion mit App :: Call in Laravel

Das grundlegende Problem ist, dass ich verschiedene Service-Container abhängig von einem speziellen Anfrage-Parameter aufrufen möchte - alle Service-Container, die die gleiche Schnittstelle/den Vertrag natürlich implementieren.

Die Fehlermeldung erhalte ich ist:

ReflectionException in Container.php line 559: 
Function registerService() does not exist 

Mein Dienstleister wie das aussieht:

<?php 

namespace App\Providers; 

use Illuminate\Http\Request; 
use Illuminate\Support\ServiceProvider; 
use App\Contracts\Extractor; 

class ExtractorServiceProvider extends ServiceProvider 
{ 
    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    protected $defer = true; 

    /** 
    * Available services for channels 
    * 
    * @var array 
    */ 
    protected $availableServices = ['AExtractor', 'ZExtractor']; 

    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->call('registerService'); 
    } 

    /** 
    * @param Request $request 
    * @return void 
    */ 
    protected function registerService(Request $request) 
    { 
     $tag = DB::table('channels')->where('id', $request->channel)->value('tag')->first()->tag; 

     $selectedExtractor = $tag . 'Extractor'; 
     $extractor = 'AExtractor'; 

     if(in_array($selectedExtractor, $this->availableServices)) { 
      $extractor = $selectedExtractor; 
     } 

     $this->app->bind('App\Contracts\Extractor', "App\\Helpers\\{$extractor}"); 
    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() 
    { 
     return [Extractor::class]; 
    } 
} 

Wie kann ich $this->app->call('registerService'); verwenden meine registerService Funktion aufzurufen und injizieren die anfordern Objekt ?

Antwort

2

Das Problem ist, bist du App:call in einer falschen Weise aufrufen: Sie das Objekt angeben, auf dem Sie das Verfahren und die Methode aufgerufen werden soll, wie folgt aus:

$this->app->call([ $this, 'registerService' ]); 
+0

Schöne, das funktioniert! Jetzt gibt es ein Problem mit der "DB" Fassade nicht gefunden, aber es ruft schließlich die 'RegisterService' Methode auf. Prost! – codedge

+0

@codedge: Für die Fassade muss man wahrscheinlich DB verwenden; oben auf Ihrer Datei – Moppo

+0

Ja, das war's! Vielen Dank! – codedge