1

J'utilise Laravel 5.2 et j'ai écrit mon propre fournisseur de services. Je souhaite injecter un objet Request dans la méthode de registre.Comment utiliser l'injection de méthode avec App :: call dans Laravel

Le problème de base est que je veux appeler un conteneur de service différent en fonction d'un paramètre de requête spécial - tout le conteneur de service implémentant la même interface/contrat bien sûr.

Le message d'erreur que je reçois est:

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

Mon fournisseur de services ressemble à ce que:

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

Comment puis-je utiliser $this->app->call('registerService'); pour appeler ma fonction registerService et injectent le Demande objet ?

Répondre

2

Le problème est que vous appelez App:call dans une mauvaise façon: vous devez spécifier l'objet sur lequel vous voulez appeler la méthode et la méthode, comme ceci:

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

Belle, qui fonctionne! Maintenant, il y a un problème avec la façade 'DB' non trouvée mais elle appelle finalement la méthode' registerService'. À votre santé! – codedge

+0

@codedge: pour la façade, vous devez probablement inclure DB d'utilisation; en haut de votre fichier – Moppo

+0

Oui, c'était ça! Merci! – codedge