ServiceProvider, ServiceContainer 入門

1439d17fca2c2d5318c6017f8cef657d?s=47 chiroruxx
February 16, 2019

ServiceProvider, ServiceContainer 入門

2019/02/16 Laravel JP Conferenceで発表する資料です。

1439d17fca2c2d5318c6017f8cef657d?s=128

chiroruxx

February 16, 2019
Tweet

Transcript

  1. 12.
  2. 20.

    サービスのコード class SendGridService { private $sendGrid; public function __construct() {

    $this->sendGrid = new SendGrid(config('services.sendgrid.key')); } public function saveUser(User $user): void { // コンタクトリストへの追加処理 } public function sendMail(Mail $mail): void { // メール送信処理 } }
  3. 25.

    元のサービスのコード class SendGridService { private $sendGrid; public function __construct() {

    $this->sendGrid = new SendGrid(config('services.sendgrid.key')); } // …その他の処理 }
  4. 27.

    サービスのコード class SendGridService { private $sendGrid; public function __construct(SendGrid $sendGrid)

    { $this->sendGrid = $sendGrid; } // …その他の処理 } 設定を受け取る
  5. 28.

    サービスのコード class SendGridService { private $sendGrid; public function __construct(SendGrid $sendGrid)

    { $this->sendGrid = $sendGrid; } // …その他の処理 } そのまま プロパティにする
  6. 37.

    コードの問題点② ▪ newだらけ! ▪ サービスの生成だけで、すごい幅をとる ▪ 本当にやりたいことはサービスを生成した後にあるは ず・・・ $settingA =

    new SettingA(); $settingB = new SettingB(); $settingC = new SettingC(); $settingD = new SettingD(); $someService = new SomeService($settingA, $settingB, $settingC, $settingD);
  7. 39.

    コードの問題点 ▪ まとめると・・・ ▪ 各処理ごとにサービスを毎回つくりたくない – ⇒サービスをまとめて管理したい – サービスコンテナ ▪

    サービスの生成をロジックに書きたくない – ⇒サービスの生成方法をまとめて管理したい – サービスプロバイダ
  8. 44.

    サービスプロバイダのコード class SendGridServiceProvider extends ServiceProvider { public function register() {

    $this->app->bind('sendgrid', function ($app) { $sendGrid = new SendGrid(config('services.sendgrid.user.key')); return new SendGridService($sendGrid); }); } }
  9. 45.

    サービスプロバイダのコード class SendGridServiceProvider extends ServiceProvider { public function register() {

    $this->app->bind('sendgrid', function ($app) { $sendGrid = new SendGrid(config('services.sendgrid.user.key')); return new SendGridService($sendGrid); }); } } key
  10. 46.

    サービスプロバイダのコード class SendGridServiceProvider extends ServiceProvider { public function register() {

    $this->app->bind('sendgrid', function ($app) { $sendGrid = new SendGrid(config('services.sendgrid.user.key')); return new SendGridService($sendGrid); }); } } key value
  11. 50.
  12. 59.

    コントローラのコード public function store(Request $request, SendGridService $sendGridService) { // …ユーザーのDB保存処理

    // sendgridのcontactに登録 $sendGridService->saveUser($user); // …メール送信 // …ビューの表示処理 }
  13. 60.

    コントローラのコード public function store(Request $request, SendGridService $sendGridService) { // …ユーザーのDB保存処理

    // sendgridのcontactに登録 $sendGridService->saveUser($user); // …メール送信 // …ビューの表示処理 } 型に先ほどのkeyを指定する