Laravel サービス

サービスプロバイダ

サービスコンテナへ登録
※App/Providers/AppServiceProvider
class AppServiceProvider extends ServiceProvider
{
 public function boot()
 {
  app()–>bind(MyService::class, function($app){
   $myService = new MyService();
   $myService–>msg = 'laravel';
   return $myService;
  });

  app()–>singleton(MyService::class, function($app){
   〜
  });

 }
}

class TestController extends Controller
{
  public function __construct(){
    $this–>myService = app()–>make(MyService::class);
  }

 public function service(){  
  return $this–>myService–>msg;
  laravel
 }
}

※App/Providers/AppServiceProvider
class AppServiceProvider extends ServiceProvider
{
 public function boot()
 {
  app()–>resolving(MyService::class, function($obj, $app){
   $obj–>msg = 'laravel';
  });

  app()–>singleton('App\〜\MyServiceInterface', MyService::class);
 }
}

class TestController extends Controller
{
 public function service(MyServiceInterface $myService){  
  return $myService–>msg;
  laravel
 }
}

サービスプロバイダ利用
プロバイダ作成
php artisan make:provider MyServiceProvider

※\app\Providers\MyServiceProvider.php
class MyServiceProvider extends ServiceProvider
{
 public function register()
 {
  $this->app->singleton(MyService::class, function($app){
   $myService = new MyService();
   $myService->msg = 'Laravel';
   return $myService;
  });
 }

 public function boot()
 {
  //
 }

}

※\config\app.php
return [
 〜
 'providers' => [
  〜
  App\Providers\MyServiceProvider::class,

 ],
];

class MyService
{
 public function msg()
 {
  return $this->msg;
 }
}

class MyServiceController extends Controller
{
 public function index(MyService $myservice)
 {
  return $myservice->msg();
  laravel
 }
}

プロバイダ作成
php artisan make:provider MyServiceProvider

※\app\Providers\MyServiceProvider.php
class MyServiceProvider extends ServiceProvider
{
 public function register()
 {
  $this->app->resolving(MyService::class, function($obj, $app){
   $obj->msg = 'Laravel';
  });

  $this->app->singleton(MyServiceInterface::class, MyService::class);
 }

 public function boot()
 {
 }

}

※\config\app.php
return [
 〜
 'providers' => [
  〜
  App\Providers\MyServiceProvider::class,

 ],
];

interface MyServiceInterface
{
 public function msg();
}

class MyService implements MyServiceInterface
{
 public function msg()
 {
  return $this->msg;
 }
}

class MyServiceController extends Controller
{
 public function index(MyServiceInterface $myservice)
 {
  return $myservice->msg();
  laravel
 }
}

利用

明示的DI

class TestController extends Controller
{
public function __construct(){
  $this–>myService = app()–>make(MyService::class);
  ↓も可
  $this–>myService = app()–>app(MyService::class);
  $this–>myService = app()–>resolve(MyService::class);
  $this–>myService = app()–>makeWith(MyService::class, 連想配列);
}

 public function service(){
  return $myService–>msg;
}

メソッドインジェクション

class MyService
{
 public function msg(){
  return 〜;
 }
}

class TestController extends Controller
{
 $myServiceにはMyServiceのインスタンスが自動的にDIされる
 public function service(MyService $myService){
  $response = [
   'msg' => $myService–>msg,
  ];
  return $response;
}

直接呼出し

resolve(MyService::class)->msg();

ファサード

ファサードクラス
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

クラス名はサービスクラスと同じである必要はないが慣例的に同じにする
class MyService extends Facade{
 protected static function getFacadeAccessor()
 {
  return 'myServiceFacade';
 }
}

ファサード登録
※\config\app.php
return [
 'aliases' => [
  〜
  'myServiceFacade' => App\App\Facades\MyService::class,
 ],
];

※\app\Providers\MyServiceProvider.php
class MyServiceProvider extends ServiceProvider
{
 public function register()
 {
  $this->app->resolving(MyService::class, function($obj, $app){
   $obj->msg = 'Laravel';
  });

  $this->app->singleton(MyServiceInterface::class, MyService::class);

  ここでbindするクラスはFacadeクラスでなくサービスクラス
  $this->app->singleton('myServiceFacade', MyService::class);
 }

 public function boot()
 {
 }

}

ファサード利用
use App\Facades\MyService;

class MyServiceController extends Controller
{
 public function index()
 {
  return MyService::msg();
 }
}

newとの違い

$myService = new MyService(〜) との違い
メソッドインジェクション、明示的DIの場合、既に生成されたインスタンスを取得する

※サービスクラスはシングルトンパターンで設計されている事がベター
デザインパターン Singleton:たった1つのインスタンス」参照

非シングルトンクラスのインスタンスをシングルトンとして取得する場合
app()–>singleton()を利用

Follow me!