【Laravel】AppServiceProviderクラスとは?AppServiceProviderの書き方

Laravel,PHP

kamiです。
TwitterYoutubeもやってます。

AppServiceProviderとは

AppServiceProviderは、Laravelのサービスプロバイダの一つで、アプリケーションのサービスコンテナへのバインディングを設定する役割を持ちます。
具体的には、インターフェースとその実装クラスを紐づけることで、依存性の解決を簡潔に管理できます。

Class AppServiceProvider extends ServiceProvider {
  // 以下省略
}

AppServiceProvider クラスは ServiceProvider クラスを継承しています。
継承することで、Laravel のサービスプロバイダ機能を利用できます。

ServiceProviderとは

LaravelでのServiceProviderはコンポーネントです。
依存関係の管理や、各種サービスの提供を効果的に行うために使用されます。

スポンサードサーチ

AppServiceProviderの作成

Artisan CLI は、以下のコマンドを使用してプロバイダーを生成します。

 php artisan make:provider AppServiceProvider

AppServiceProviderClass

<?php
 
namespace App\Providers;
 
use App\Contracts\DowntimeNotifier;
use App\Contracts\ServerProvider;
use App\Services\DigitalOceanServerProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\ServerToolsProvider;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * All of the container bindings that should be registered.
     *
     * @var array
     */
    public $bindings = [
        ServerProvider::class => DigitalOceanServerProvider::class,
    ];
 
    /**
     * All of the container singletons that should be registered.
     *
     * @var array
     */
    public $singletons = [
        DowntimeNotifier::class => PingdomDowntimeNotifier::class,
        ServerProvider::class => ServerToolsProvider::class,
    ];
}

スポンサードサーチ

$bindingsとは

$bindingsとは、抽象クラスとその具体的な実装クラスを関連付けるための配列です。
この配列内のバインディングは、依存性の解決時に使用されます。
例えば、ServerProvider インターフェースが DigitalOceanServerProvider クラスと関連付けられています。

$singletonsとは

$singletonsとは、シングルトンとして登録するクラスとその具体的な実装クラスを関連付けるための配列です。
シングルトンは、アプリケーション内で唯一のインスタンスを保持するため、同じインスタンスが複数の依存性に提供されます。例えば、DowntimeNotifier クラスは PingdomDowntimeNotifier クラスと、ServerProvider インターフェースは ServerToolsProvider クラスと関連付けられています。

このコードはアプリケーション内の依存性の解決やサービスの提供方法を設定しています。バインディングとシングルトンの定義により、Laravel コンテナは依存性を解決し、必要なときに適切なインスタンスを提供します。

スポンサードサーチ

AppServiceProviderを使った実例

HogeUsecaseインターフェースと HogeService クラスを AppServiceProvider 内でシングルトンとしてバインドしています。

class AppServiceProvider extends ServiceProvider
{
    public $singletons = [
       \App\Usecases\Dir\HogeUsecase::class =>. \App\Infrastructures\Services\Dir\HogeService::class,
    ]
}

この設定により、アプリケーション内で HogeUsecase が必要になった場合、HogeService のインスタンスが1つだけ作成され、同じインスタンスが使い回されます。
これにより、オブジェクトの管理がシンプルになり、リソースの節約にもつながります。

HogeUsecase

HogeUsecaseは、ビジネスロジックを定義するインターフェースです。
このインターフェースを実装することで、異なる実装を簡単に差し替えることが可能になります。

<?php
namespace App\Usecases\Dir;

use Illuminate\Http\Request;

/**
 * Undocumented class
 */
class HogeDto
{
    /**
     * Undocumented function
     *
     */
    public function __construct()
    {
    }
}
interface UpdateShopDataUsecase
{
    /**
     * Undocumented function
     * 
     * @return HogeDto[]
     * 
     */
    public function execute(Request $request);

}

このインターフェースを利用することで、依存関係の注入(DI: Dependency Injection)が容易になり、テストのしやすさやコードの保守性が向上します。

HogeService

HogeServiceはHogeUsecase を実装したクラスで、実際の処理を担当します。
データベースのトランザクション処理を行い、必要に応じてロールバックを実施する仕組みになっています。

<?php

namespace App\Infrastructures\Services\Dir;

use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

/**
 * Hogeサービスクラス
 */

class HogeService implements HogeUsecase
{
    public function __construct()
    {
    }

    /**
     * Undocumented function
     *
     * @return void
     */
public function execute($request)
  {
      try {
        DB::transaction(function () use ($request) {
        // 省略
        });
      } catch (\Exception $e) {
        DB::rollBack();
        return $e->getMessage();
      } 
  }
}

HogeServiceはHogeUsecaseを実装しているため、AppServiceProvider で HogeUsecaseを HogeServiceにバインドすると、コントローラーや他のサービスクラスで HogeUsecase を依存注入(DI)するだけでHogeService の機能を利用できます。

まとめ

  • AppServiceProviderを利用することで、依存性の解決を簡単に管理できる。
  • HogeUsecase はインターフェースとしてビジネスロジックの抽象化を行い、HogeService がその実装を担当する。
  • AppServiceProvider の singletons に HogeUsecase をバインドすることで、シングルトンとして HogeService をアプリケーション全体で共有できる。

このように AppServiceProviderを活用することで、コードのモジュール化や保守性の向上が可能になります。

実装やエラーが解決できない場合

プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。

考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。

そういう時は聞ける先輩や、メンターに相談することが大事です。

僕にも相談可能なので気軽に相談してください。

Twitterからの連絡だと確実ですよ。

オンラインスクールやプログラミングスクールといったプログラミングを学べる方法もあるので、そちらもぜひ活用してもいいと思います。

Web開発で分からない時

オンライン完結型スクール DMM WEBCAMP PRO

アプリ開発で分からない時

プログラミング×稼げる副業スキルはテックキャンプ

プログラミングについて分からない時

【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。
ミニマリスト_カミ

僕への個人でもメンターでも、スクールでもお好きな方を活用ください。

Laravel,PHPLaravel

Posted by kami