2017-05-19 8 views
1

サービスクラスを定義しましたFooService;LaravelのサービスへのDI

<?php 

namespace My\Services; 

use My\Contracts\Services\FooServiceContract; 

class FooService implements FooServiceContract 
{ 

    public function doSomething() 
    { 
     return 'fubar'; 
    } 
} 

AppServiceProviderに登録されているインターフェイスを拡張します。

<?php 

namespace My\Providers; 

use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider 
{ 

    private $singletons = [ 
     \My\Services\FooContract::class => \My\Services\FooService::class, 
    ]; 


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

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->registerLogger(); 

     foreach ($this->singletons as $abstract => $concrete) { 
      $this->app->singleton($abstract, $concrete); 
     } 
    } 
} 

私はこれを他の場所(私のコントローラ)で使うことができるように私は特性を作りました。 特性

<?php 
namespace My\Dependencies; 

use My\Contracts\Services\FooServiceContract; 

trait TheFooService 
{ 
    protected function getDashboardService() 
    { 
     return app(FooServiceContract::class); 
    } 
} 

コントローラの例;

<?php 
namespace My\Http\Controllers\Billing; 

use My\Http\Controllers\Controller; 
use My\Dependencies\TheFooService; 


class BarController extends Controller 
{ 
    use TheFooService; 

    public function hello() 
    { 
     $a = $this->TheFooService()->doSomething(); 
     // ... 
    } 
} 

これはすべて正常に動作します。

しかし、別の定義されたクラスをサービスクラスに追加する方法はありますか?それで、クラスを使用することができますか?
私がこれを読んだところから、構造体にクラスをタイプヒントしたときに機能しますが、インターフェイスの型指定ができるようにしたいと考えています。
たとえば、私が最後にしたいのは、

<?php 

namespace My\Services; 

use My\Contracts\Services\FooServiceContract; 

class FooService implements FooServiceContract 
{ 

    public function __construct(BobInterface $randonClass) 
    { 
     $this->name = $randomClass; 
    } 
} 

答えて

関連する問題