Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ServiceProvider, ServiceContainer 入門

chiroruxx
February 16, 2019

ServiceProvider, ServiceContainer 入門

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

chiroruxx

February 16, 2019
Tweet

More Decks by chiroruxx

Other Decks in Technology

Transcript

  1. サービスのコード 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 { // メール送信処理 } }
  2. 元のサービスのコード class SendGridService { private $sendGrid; public function __construct() {

    $this->sendGrid = new SendGrid(config('services.sendgrid.key')); } // …その他の処理 }
  3. サービスのコード class SendGridService { private $sendGrid; public function __construct(SendGrid $sendGrid)

    { $this->sendGrid = $sendGrid; } // …その他の処理 } 設定を受け取る
  4. サービスのコード class SendGridService { private $sendGrid; public function __construct(SendGrid $sendGrid)

    { $this->sendGrid = $sendGrid; } // …その他の処理 } そのまま プロパティにする
  5. コードの問題点② ▪ newだらけ! ▪ サービスの生成だけで、すごい幅をとる ▪ 本当にやりたいことはサービスを生成した後にあるは ず・・・ $settingA =

    new SettingA(); $settingB = new SettingB(); $settingC = new SettingC(); $settingD = new SettingD(); $someService = new SomeService($settingA, $settingB, $settingC, $settingD);
  6. コードの問題点 ▪ まとめると・・・ ▪ 各処理ごとにサービスを毎回つくりたくない – ⇒サービスをまとめて管理したい – サービスコンテナ ▪

    サービスの生成をロジックに書きたくない – ⇒サービスの生成方法をまとめて管理したい – サービスプロバイダ
  7. サービスプロバイダのコード 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); }); } }
  8. サービスプロバイダのコード 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
  9. サービスプロバイダのコード 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
  10. コントローラのコード public function store(Request $request, SendGridService $sendGridService) { // …ユーザーのDB保存処理

    // sendgridのcontactに登録 $sendGridService->saveUser($user); // …メール送信 // …ビューの表示処理 }
  11. コントローラのコード public function store(Request $request, SendGridService $sendGridService) { // …ユーザーのDB保存処理

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