Php/laravel/laravel5/DI
目次
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
