「Php/laravel/laravel5/DI」の版間の差分
(→singletonの場合のサンプル) |
(→laravelでDIを使うには) |
||
(同じ利用者による、間の7版が非表示) | |||
行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を生成してくれる | |
use App\Services\Service; | use App\Services\Service; | ||
class IocController extends Controller | class IocController extends Controller |
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