プロバイダというのは提供者という意味です。
今回はサービスコンテナにサービスを登録する仕組みを紹介していきます。
※サービスコンテナについてわからない方は以下の記事も見ておくと理解力が深まると思います。
参考記事「readouble.com」
サービスプロバイダには大きく分けて2つ
register()
とboot()
というメソッドがあって
register()
の中でapp()
サービスコンテナにサービスを登録して
boot()
の方で全てのサービスを登録した後に実行したい処理を書くという流れになります。
サービスプロバイダの使い方
サービスプロバイダが記述されている場所
config > app.php
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Package Service Providers...
*/
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
137行目あたりに'providers' => []
という配列がありこの中にサービスプロバイダがいくつも記載されております。
Laravelを表示するタイミングでこれらのサービスプロバイダが読み込まれます。
今回は簡単なサービスプロバイダを実際に使ってみようと思います。
暗号系のサービスプロバイダ
Illuminate\Encryption\EncryptionServiceProvider::class,
こちらが暗号系のサービスプロバイダで簡単に使用できるので試しに使っていきましょう。
こちらのファイルは以下に存在しています。
vendor > laravel > framework > src > illuminate > Encryption > EncryptionServiceProvider.php
このクラスの中にregister()
というメソッドがあります。
public function register()
{
$this->registerEncrypter(); //ここ
$this->registerOpisSecurityKey();
$this->registerSerializableClosureSecurityKey();
}
こちらは、サービスコンテナに登録するための処理が書かれています。
例えば、$this->registerEncrypter();
の処理を見ていきます。
protected function registerEncrypter()
{
$this->app->singleton('encrypter', function ($app) {
$config = $app->make('config')->get('app');
return new Encrypter($this->parseKey($config), $config['cipher']);
});
}
このようにコードが記載されており、app->singleton('encrypter'
でサービスコンテナにencrypter
という名前で登録していることがわかります。
実際に以下でencrypter
を簡単に使用してみることにします。
ルーティングの作成
最初にルーティングファイルから作ることにします。
routes > web.php
use App\Http\Controllers\LifeCycleController;
Route::get('/provider', [LifeCycleController::class, 'showServiceProvider']);
web.phpに記述する事ができたらコントローラーを作成していきます。
コントローラーの作成
次にターミナルで以下を実行してコントローラーを作成していきます。
php artisan make:controller LifeCycleController
上で作成したLifeCycleControllerは以下の場所に作成されます。
app > Http > Controllers > LifeCycleController
上のコントローラーが確認できたらOKです!
実際にコードを書いていく
app > Http > Controllers > LifeCycleController
class LifeCycleController extends Controller
{
public function showServiceProvider()
{
$encrypt = app()->make('encrypter');
$password = $encrypt->encrypt('password');
dd($password, $encrypt->decrypt($password));
}
app()->make()
でサービスを使うことができて、サービス名を'encrypter'
としています。
上の処理でインスタンスして$encrypt
の中のencrypt()
メソッドで'password'
という文字列を暗号化しています。
$encrypt->decrypt()
を使用すると複合化してくれます。「暗号化した物を元に戻す」
表示結果
以下ように表示されていればOK!
上がencrypt()
メソッドでパスワードを暗号化しているのがわかります。
下がdecrypt()
メソッドで暗号化されたパスワードを元に戻しているのがわかります。
サービスプロバイダを自身で作成する方法「説明のみ」
サービスプロバイダを作成するには以下の専用のコマンドを使用していきます。
php artisan make:provider ServiceProvider
ServiceProviderの箇所はクラス名
作成したProviderは以下の箇所に存在します。
app > Providers > ServiceProvider
class ServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
register()の方で登録される処理を書いていきます。
register()を実際に使用するために
config > app.php
の中にある’providers’ ⇒ []の配列の中の一番下に以下を追加します。
App\Providers\ServiceProvider::class
これでブラウザを再読み込みすると上のサービスプロバイダが使用できるようになります。
以上
サービスプロバイダを使いこなせると色々な事が簡単に実装できたり
自分でサービスを作成することでそのアプリケーションに合ったサービスも作成できるようになるのでより良いサービスが作れるようになります。