facebook twitter hatena line email

「Php/laravel/laravel5/DI」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(複数サービスコンテナをApp::make()で追加する場合のサンプル)
(laravelでDIを使うには)
 
(同じ利用者による、間の11版が非表示)
行1: 行1:
 +
==laravelでDIを使うには==
 +
サービスコンテナ(旧名称:IoC)というものが用意されている
 +
 
==IoCとは==
 
==IoCとは==
 
Inversion of Control(制御反転)
 
Inversion of Control(制御反転)
行5: 行8:
  
 
==PHPのDIについてはこちらを参考==
 
==PHPのDIについてはこちらを参考==
[[php/pimple]] [ショートカット]]
+
[[php/pimple]] [ショートカット]
  
 
==Laravelには3種類方法がある==
 
==Laravelには3種類方法がある==
行38: 行41:
 
         $service = app('Service');
 
         $service = app('Service');
 
         // $service = App::make('Service');
 
         // $service = App::make('Service');
 +
        echo $service->doSomething();
 +
    }
 +
}
 +
 +
app()はlaravel5から使えるようになったApp::make()のエイリアス
 +
 +
==ServicesのUserを使う例==
 +
以下AppServiceProviderはconfig/app.phpのProviderに登録されているので今回はここへ追記する
 +
 +
-app/Providers/AppServiceProvider.php
 +
namespace App\Providers;
 +
use Illuminate\Support\ServiceProvider;
 +
use App\Services\Service;
 +
class AppServiceProvider extends ServiceProvider
 +
{
 +
    public function register()
 +
    {   
 +
            $this->app->bind('App\Services\User', function ($app) {
 +
                return new \App\Services\User();
 +
            });
 +
    }
 +
}
 +
 +
-app/Controller/IocController.php
 +
use App\Http\Controllers\Controller;
 +
use App\Services\Service;
 +
class IocController extends Controller
 +
{
 +
    public function index()
 +
    {
 +
        $service = app('App\Services\User');
 +
        // $service = App::make('App\Services\User');
 
         echo $service->doSomething();
 
         echo $service->doSomething();
 
     }
 
     }
行45: 行80:
  
 
==Constructor Injection==
 
==Constructor Injection==
Constructで記述すれば勝手にinstanceを生成してくれる
+
コントローラーやミドルウェアのConstructの引数に記述すれば勝手にinstanceを生成してくれる
 
  use App\Services\Service;
 
  use App\Services\Service;
 
  class IocController extends Controller
 
  class IocController extends Controller
行93: 行128:
 
         echo $client->doSomething();
 
         echo $client->doSomething();
 
     }
 
     }
 +
}
 +
 +
==singletonの場合のサンプル==
 +
-app/Provider/AppServiceProvider
 +
class AppServiceProvider extends ServiceProvider
 +
{
 +
    public function register()
 +
    {
 +
        $this->app->singleton('Mysingleton', 'stdClass');
 +
        // $this->app->singleton('Mysingleton', 'User');  // 作成したクラスを指定することもできる
 +
    }
 +
}
 +
 +
-app/Controller/IocController.php
 +
class IocController extends Controller
 +
{
 +
    public function index()
 +
    {
 +
        $my = app('Mysingleton');
 +
        $my->name = 'hoge';
 +
        $my2 = app('Mysingleton');
 +
        echo $my2->name;
 +
      }
 
  }
 
  }
  

2018年2月7日 (水) 14:13時点における最新版

laravelでDIを使うには

サービスコンテナ(旧名称:IoC)というものが用意されている

IoCとは

Inversion of Control(制御反転)

Laravelで使えるクラス間の依存を管理する管理ツールです。

PHPのDIについてはこちらを参考

php/pimple [ショートカット]

Laravelには3種類方法がある

  • App::make()
  • Constructor Injection
  • Method Injection (Laravel5から追加)

App::Make()

以下AppServiceProviderはconfig/app.phpのProviderに登録されているので今回はここへ追記する

-app/Providers/AppServiceProvider.php

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\Service;
class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('Service', function ($app) {
            return new Service();
        });
    }
}

-app/Controller/IocController.php

use App\Http\Controllers\Controller;
use App\Services\Service;
class IocController extends Controller
{
    public function index()
    {
        $service = app('Service');
        // $service = App::make('Service');
        echo $service->doSomething();
    }
}

app()はlaravel5から使えるようになったApp::make()のエイリアス

ServicesのUserを使う例

以下AppServiceProviderはconfig/app.phpのProviderに登録されているので今回はここへ追記する

-app/Providers/AppServiceProvider.php

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\Service;
class AppServiceProvider extends ServiceProvider
{
    public function register()
    {    
           $this->app->bind('App\Services\User', function ($app) {
               return new \App\Services\User();
           });
    }
}

-app/Controller/IocController.php

use App\Http\Controllers\Controller;
use App\Services\Service;
class IocController extends Controller
{
    public function index()
    {
        $service = app('App\Services\User');
        // $service = App::make('App\Services\User');
        echo $service->doSomething();
    }
}

app()はlaravel5から使えるようになったApp::make()のエイリアス

Constructor Injection

コントローラーやミドルウェアのConstructの引数に記述すれば勝手にinstanceを生成してくれる

use App\Services\Service;
class IocController extends Controller
{
    public function __construct(Service $service)
    {
        echo $service->doSomething();
    }
}

Method Injection

Methodで記述すれば勝手にinstanceを生成してくれる

use App\Services\Service;
class IocController extends Controller
{
    public function index(Service $service)
    {
        echo $service->doSomething();
    }
}

複数サービスコンテナをApp::make()で追加する場合のサンプル

-app/Provider/AppServiceProvider.php

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('Service', function ($app) {
            return new Service();
        });
        $this->app->bind('Client', function ($app) {
            return new Client($app->make('Service'));
        });
    }
}

-app/Controller/IocController.php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Services\Client;
class IocController extends Controller
{
    public function index()
    {
        $client = app('Client');
        echo $client->doSomething();
    }
}

singletonの場合のサンプル

-app/Provider/AppServiceProvider

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('Mysingleton', 'stdClass');
        // $this->app->singleton('Mysingleton', 'User');  // 作成したクラスを指定することもできる
    }
}

-app/Controller/IocController.php

class IocController extends Controller
{
    public function index()
    {
        $my = app('Mysingleton');
        $my->name = 'hoge';
        $my2 = app('Mysingleton');
        echo $my2->name;
     }
}

参考

公式laravel5.5のサービスコンテナ https://readouble.com/laravel/5.5/ja/container.html

Laravel5 - もっと強力的なIoC (4th) http://qiita.com/fluke8259/items/99d019a1a8a9f32508b2

IoCコンテナでオブジェクトを生成する http://recipes.laravel.jp/recipe/18