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で話せなかった資料です。
98ページあります。

chiroruxx

February 16, 2019
Tweet

More Decks by chiroruxx

Other Decks in Technology

Transcript

  1. ユーザ情報の登録のコード // …ユーザのDB保存処理 // sendgridのcontactに登録 $sendGrid = new SendGrid(config('services.sendgrid.key')); $recipient

    = new Recipient( $user->first_name, $user->last_name, $user->mail_address ); $response = $sendGrid->client->contactdb() ->recipients()->post([$recipient]); if (!starts_with($response->statusCode(), '20')) { Log::error('ユーザを登録できませんでした。'); }
  2. ユーザ情報の登録のコード // …ユーザのDB保存処理 // sendgridのcontactに登録 $sendGrid = new SendGrid(config('services.sendgrid.key')); $recipient

    = new Recipient( $user->first_name, $user->last_name, $user->mail_address ); $response = $sendGrid->client->contactdb() ->recipients()->post([$recipient]); if (!starts_with($response->statusCode(), '20')) { Log::error('ユーザを登録できませんでした。'); } SDKを初期化
  3. ユーザ情報の登録のコード // …ユーザのDB保存処理 // sendgridのcontactに登録 $sendGrid = new SendGrid(config('services.sendgrid.key')); $recipient

    = new Recipient( $user->first_name, $user->last_name, $user->mail_address ); $response = $sendGrid->client->contactdb() ->recipients()->post([$recipient]); if (!starts_with($response->statusCode(), '20')) { Log::error('ユーザを登録できませんでした。'); } SDKを初期化 ユーザ情報を作成
  4. ユーザ情報の登録のコード // …ユーザのDB保存処理 // sendgridのcontactに登録 $sendGrid = new SendGrid(config('services.sendgrid.key')); $recipient

    = new Recipient( $user->first_name, $user->last_name, $user->mail_address ); $response = $sendGrid->client->contactdb() ->recipients()->post([$recipient]); if (!starts_with($response->statusCode(), '20')) { Log::error('ユーザを登録できませんでした。'); } SDKを初期化 ユーザ情報を作成 ユーザ登録API
  5. ユーザ情報の登録のコード // …ユーザのDB保存処理 // sendgridのcontactに登録 $sendGrid = new SendGrid(config('services.sendgrid.key')); $recipient

    = new Recipient( $user->first_name, $user->last_name, $user->mail_address ); $response = $sendGrid->client->contactdb() ->recipients()->post([$recipient]); if (!starts_with($response->statusCode(), '20')) { Log::error('ユーザを登録できませんでした。'); } SDKを初期化 ユーザ情報を作成 ユーザ登録API エラーの場合は ログ出力
  6. メール送信のコード // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ',

    new Content('text/plain', '会員登録を受付ました。') ); $response = $sendGrid->client->mail()->send()->post($mail); if (!starts_with($response->statusCode(), '20')) { Log::error('メールを送信できませんでした。'); } // …ビューの表示処理
  7. メール送信のコード // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ',

    new Content('text/plain', '会員登録を受付ました。') ); $response = $sendGrid->client->mail()->send()->post($mail); if (!starts_with($response->statusCode(), '20')) { Log::error('メールを送信できませんでした。'); } // …ビューの表示処理 メール作成
  8. メール送信のコード // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ',

    new Content('text/plain', '会員登録を受付ました。') ); $response = $sendGrid->client->mail()->send()->post($mail); if (!starts_with($response->statusCode(), '20')) { Log::error('メールを送信できませんでした。'); } // …ビューの表示処理 メール作成 メール送信API
  9. メール送信のコード // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ',

    new Content('text/plain', '会員登録を受付ました。') ); $response = $sendGrid->client->mail()->send()->post($mail); if (!starts_with($response->statusCode(), '20')) { Log::error('メールを送信できませんでした。'); } // …ビューの表示処理 メール作成 メール送信API エラーの場合は ログ出力
  10. サービスのコード 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 { // 元のコントローラから処理をコピー } }
  11. コントローラのコード // …ユーザーのDB保存処理 // sendgridのcontactに登録 $sendGridService = new SendGridService(); $sendGridService->saveUser($user);

    // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ', new Content('text/plain', '会員登録を受付ました。') ); $sendGridService->sendMail($mail); // …ビューの表示処理
  12. コントローラのコード // …ユーザーのDB保存処理 // sendgridのcontactに登録 $sendGridService = new SendGridService(); $sendGridService->saveUser($user);

    // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ', new Content('text/plain', '会員登録を受付ました。') ); $sendGridService->sendMail($mail); // …ビューの表示処理 サービス作成
  13. コントローラのコード // …ユーザーのDB保存処理 // sendgridのcontactに登録 $sendGridService = new SendGridService(); $sendGridService->saveUser($user);

    // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ', new Content('text/plain', '会員登録を受付ました。') ); $sendGridService->sendMail($mail); // …ビューの表示処理 サービス作成 ユーザ登録
  14. コントローラのコード // …ユーザーのDB保存処理 // sendgridのcontactに登録 $sendGridService = new SendGridService(); $sendGridService->saveUser($user);

    // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ', new Content('text/plain', '会員登録を受付ました。') ); $sendGridService->sendMail($mail); // …ビューの表示処理 サービス作成 ユーザ登録 メール作成
  15. コントローラのコード // …ユーザーのDB保存処理 // sendgridのcontactに登録 $sendGridService = new SendGridService(); $sendGridService->saveUser($user);

    // 登録完了メール送信 $mail = new Mail( '[email protected]', $user->mail_address, '会員登録受付のお知らせ', new Content('text/plain', '会員登録を受付ました。') ); $sendGridService->sendMail($mail); // …ビューの表示処理 サービス作成 ユーザ登録 メール作成 メール送信
  16. サービスのコード class SendGridService { private $sendGrid; public function __construct(SendGrid $sendGrid)

    { $this->sendGrid = $sendGrid; } // …その他の処理 } 設定を受け取る
  17. サービスプロバイダのコード 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); }); } }
  18. サービスプロバイダのコード 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
  19. サービスプロバイダのコード 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
  20. コントローラのコード public function store(Request $request, SendGridService $sendGridService) { // …ユーザーのDB保存処理

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

    // sendgridのcontactに登録 $sendGridService->saveUser($user); // …メール送信 // …ビューの表示処理 } アクションの引数で渡せる
  22. FakeMailerServiceのコード class FakeMailerService implements MailerService { function saveUser(User $user): void

    { // …ログ出力処理 } function deleteUsers(array $users): void { // …ログ出力処理 } function sendMail(Mail $mail): void { // …ログ出力処理 } }
  23. FakeMailerServiceのコード class FakeMailerService implements MailerService { function saveUser(User $user): void

    { // …ログ出力処理 } function deleteUsers(array $users): void { // …ログ出力処理 } function sendMail(Mail $mail): void { // …ログ出力処理 } } インターフェース を設定
  24. MailerServiceProviderのコード class MailerServiceProvider extends ServiceProvider { public function register() {

    if (env('app_env') === 'local') { $this->app->bind(MailerService::class, function () { return new FakeMailerService(); }); } else { $this->app->bind(MailerService::class, function () { return resolve(SendGridService::class); }); } } }
  25. MailerServiceProviderのコード class MailerServiceProvider extends ServiceProvider { public function register() {

    if (env('app_env') === 'local') { $this->app->bind(MailerService::class, function () { return new FakeMailerService(); }); } else { $this->app->bind(MailerService::class, function () { return resolve(SendGridService::class); }); } } } envが開発環境 だったら
  26. MailerServiceProviderのコード class MailerServiceProvider extends ServiceProvider { public function register() {

    if (env('app_env') === 'local') { $this->app->bind(MailerService::class, function () { return new FakeMailerService(); }); } else { $this->app->bind(MailerService::class, function () { return resolve(SendGridService::class); }); } } } MailerServiceに Fakeを設定
  27. MailerServiceProviderのコード class MailerServiceProvider extends ServiceProvider { public function register() {

    if (env('app_env') === 'local') { $this->app->bind(MailerService::class, function () { return new FakeMailerService(); }); } else { $this->app->bind(MailerService::class, function () { return resolve(SendGridService::class); }); } } } envが開発環境 でないなら
  28. MailerServiceProviderのコード class MailerServiceProvider extends ServiceProvider { public function register() {

    if (env('app_env') === 'local') { $this->app->bind(MailerService::class, function () { return new FakeMailerService(); }); } else { $this->app->bind(MailerService::class, function () { return resolve(SendGridService::class); }); } } } MailerServiceに SendGridを設定
  29. コントローラのコード public function store(Request $request, MailerService $mailerService) { // …ユーザーのDB保存処理

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

    // sendgridのcontactに登録 $mailerService->saveUser($user); // …ビューの表示処理 } 型を インターフェース に変更