2018/10/12
Composerを使ってLaravelのライブラリをインストールして設定するときに必ず出てくるキーワードがあります。
それが「サービスプロバイダー」「サービスコンテナ」です。
この意味ですが、Laravelの公式サイトも含め、解説サイトをいろいろ読んだのですが難しい。。
今回チュートリアルを進めながら「サービスプロバイダー」「サービスコンテナ」について理解したいと思います。
チュートリアル
サービスプロバイダーとサービスコンテナの意味を理解するために、チュートリアルを実施しながら意味をとらえていきたいと思います。
デモ用のクラスを作成。サービスプロバイダーを作成して、その中でサービスコンテナへサービス(デモ用のクラス)を登録。ファサードを使って表示。
手順
【1】クラスを作る
【2】サービスプロバイダーの作成
【3】サービスコンテナを登録する
【4】サービスプロバイダーを登録する
【5】ファサードを作成
【6】ファサードのエイリアスを作成
【7】実際に呼び出して使う
【1】クラスを作る
実装するクラス(TestEchoHelperクラス)を以下のように記述します。
デモなのでエコーだけの簡単なプログラムです。
<?php namespace App\Helpers; class TestEchoHelper { public function testEcho(){ return 'TestEchoHelperクラスの呼び出しが成功しました!'; } }
【2】サービスプロバイダーの作成
作成したTestEchoHelperクラスを呼び出すためにサービスプロバイダーの機能を使います。
サービスコンテナ・・・インスタンス化方法を定める
まずは、サービスプロバイダーを作成します。
サービスプロバイダーはartisanコマンドでスケルトンを作成することができます。
php artisan make:provider TestEchoServiceProvider
上記のコマンドを実行すると app/providers に TestEchoServiceProvider.php が作成されます。
中身を見てみます。
: class TestEchoServiceProvider extends ServiceProvider { public function boot() { // } public function register() { // } }
bootメソッドとregisterメソッドができてます。
サービスコンテナへの登録はregisterメソッドに記述します。
その前にuseで
サービスコンテナの実態のクラス(\Illuminate\Contracts\Foundation\Application)とデモで作成したクラス TestEchoHelper クラスのパスを通しておきます。
use Illuminate\Foundation\Application; use App\Helpers\TestEchoHelper; :
【3】サービスコンテナを登録する
register()で、サービスコンテナへの登録を実装します。
laravelでは「バインドする」とも言います。
: public function register() { // $this->app->bind('TestEcho', function(Application $app){ return new TestEchoHelper(); }); }
$this->app がサービスコンテナになります。
bind() はオブジェクトのインスタンス化方法を登録する関数です。
サービスコンテナにbind()メソッドでキー名(TestEcho)にクラスを紐付けて登録します。
ここまでで「TestEchoHelperクラスを呼び出す方法をサービスコンテナに登録する」作業が終わりました。
ここから先はサービスプロバイダーが呼び出され、ファサードで出力できる処理を書いていきます。
【4】サービスプロバイダーを登録する
Laravel起動時にサービスプロバイダーが呼び出されるようにします。
そのためにサービスプロバイダーを config/app.php に登録します。
'providers' => [ /* * Laravelのコアサービスのサービスプロバイダー */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, : /* * アプリケーション固有のサービスプロバイダー */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, : /* * Composerで追加したパッケージのサービスプロバイダー */ Laravel\Socialite\SocialiteServiceProvider::class, App\Providers\TestEchoServiceProvider::class, // サービスプロバイダーの登録 ], :
【解説】
Laravelのパッケージをインストールした事のある方は、 app.phpにサービスプロバイダーを登録したことがあるかと思います。
Laravelのライブラリ追加方法
ここに登録することで、Laravel起動時にTestEchoServiceProviderクラスのregisterメソッドとbootメソッド(あれば)が実行されます。
【5】ファサードを作成
app/Facades ディレクトリを作成してファサードを作成します。
このFacadeクラスの getFacadeAccesorメソッドに「サービスコンテナに登録されたインスタンス化方法の名前を返す」 処理を記述します。
namespace App\Facades; use Illuminate\Support\Facades\Facade; class TestEchoFacade extends Facade { protected static function getFacadeAccessor() { return 'TestEcho'; } }
【6】ファサードのエイリアスを作成
作成したファサードを別名(短い名前)で呼び出せるようにしておきます。
ライブラリをいれたことがある方は見覚えがあるかと思います。
config/app.php にてエイリアスを記述します。
'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, : 'Socialite' => Laravel\Socialite\Facades\Socialite::class, 'TestEcho' => App\Facades\TestEchoFacade::class ],
【7】実際に呼び出して使う
Controller
class TestContrller extends Controller { public function index(){ return \TestEcho::testEcho(); } }
Router
Route::get('/testecho/',[ 'uses' => 'TestController@index', 'as' => 'testecho' ]);
プレビュー
http://{ホスト名}/testecho/ にアクセス
サービスコンテナとサービスプロバイダーに関しては以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。