2016-04-05 14 views
1

Tümü aynı arabirimi/sözleşmeyi uygulayan ve kullanılan hizmetin kullanıcı girdisine bağlı olduğu birden çok hizmet oluşturmaya çalışıyorum. Bu yüzden kontrolörden, kullanıcı tarafından seçilen hizmeti almak için yapabilirim.Aynı arabirimi uygulayan birden çok hizmet, çalışma zamanında geçiş yapma

Hizmet Sağlayıcı: denetleyici olarak

/** 
* Register the application services. 
* 
* @return void 
*/ 
public function register() 
{ 
    $this->app->call([$this, 'registerProductionService']); 
} 

/** 
* Produce video depend on user selection. 
* 
* @param Request $request 
*/ 
public function registerProductionService(Request $request) 
{ 
    $service = studly_case($request->input('production')) . 'Repository'; 

    if (in_array($service, $this->availableServices)) 
    { 
     $namespace = (new \ReflectionClass(ReportContract::class))->getNamespaceName(); 

     $this->app->bind(ReportContract::class, "{$namespace}\\{$service}"); 
    } 
} 

:

public function create(ReportContract $report) 
{ 
    $report->create(); 
} 

Ama) (yaratmak call kuyruktan yöntem istediğinizde, ben iste sınıf veri alınamıyor. Bu, kullanıcıdan seçilen hizmeti alamam anlamına mı geliyor? Peki bunu nasıl yapabilirim?

+1

Bu güzel bir soru ama servis sağlayıcısında kayıtlı olan laravel hizmetleriyle çalışma zamanında yapabileceğinizi sanmıyorum. Bu, bootstrap zamanında yüklenmelidir. Ara katmanlarda benzer bir şeye ulaşmanız mümkün olabilir; ara katman istek nesnesine erişebilir ve bu nedenle arayüz ile uygulama arasında o sırada bir bağ kurabilmelidir. – delatbabel

+0

Ara katman yazılımı ile çözemiyorum. Bana bir örnek verebilir misin? Teşekkür ederim !!! – user3118789

cevap

1

Bir geri arama ile bağlayabilir:

$this->app->bind(ReportContract::class, function($app) { 
    $request = $app['request']; 

    $service = studly_case($request->input('production')) . 'Repository'; 

    if (in_array($service, $this->availableServices)) 
    { 
     $namespace = (new \ReflectionClass(ReportContract::class))->getNamespaceName(); 

     return $app->make("{$namespace}\\{$service}"); 
    } 
}); 

Gerçi bir varsayılan dönmek isteyebilirsin.

+0

Bu işe yaramaz, $ request-> all() her zaman boş diziye döner. – user3118789

İlgili konular