【Laravel入門】interfaceとimplementsについて理解と実装を行う

2024年7月4日Laravel,PHP

ミニマリスト_カミ

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

今回はinterfaceとimplementsについて理解と実装の紹介です。

Interfaceとは?

Interface(Interface)とは、クラスが実装すべきメソッドの宣言だけを含む型です。
具体的な実装は含まれておらず、メソッドのシグネチャ(名前、引数、返り値の型)だけを定義します。Interfaceを使うことで、異なるクラスが同じメソッドを持つことを保証できます。

InterfaceImplementsはセットで使います。

<?php

interface インターフェース名
{
   public function 関数名(): 戻り値の型;
}

implementsとは?

Implements(インプリメンツ)は、クラスがInterfaceで宣言されたメソッドを実装することを示します。
クラスはInterfaceのメソッドをすべて実装しなければなりません。

<?php

class クラス名 implements インターフェース名
{
  public function 関数名(): 戻り値の型
  {
   // 関数の実行内容
  }
}

スポンサードサーチ

ControllerでInterfaceとimplementsを使った例

Interfaceの定義

HogeInterfaceというInterfaceを定義します。

// app/Contracts/HogeInterface.php
namespace App\Contracts;

interface HogeInterface
{
    public function getHoge(): string;
}

Interfaceは、サービスプロバイダで使用するために「app/Contracts」ディレクトリに配置します。

Interfaceの実装(implementsの使用)

Interfaceを実装するクラスを作成します。

// app/Services/HogeService.php
namespace App\Services;

use App\Contracts\HogeInterface;

class HogeService implements HogeInterface
{
    public function getHoge(): string
    {
        return 'hoge';
    }
}

「app/ServicesディレクトリにHogeServiceクラスを作成します。

AppServiceProviderでバインディング

AppServiceProvider(プロバイダ)でInterfaceと実装クラスをバインディングします。

// app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Contracts\HogeInterface;
use App\Services\HogeService;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(HogeInterface::class, HogeService::class);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

app/Providers/AppServiceProvider.phpを編集します。

AppServiceProviderとは?

AppServiceProviderは、Laravelアプリケーションのコア部分を構成し、様々なサービス(依存関係)の登録と設定を行います。

「AppServiceProviderはapp/Providers」ディレクトリにあり、「Illuminate\Support\ServiceProvider」クラスを拡張しています。

  • サービスコンテナへのバインディング:
    • サービスプロバイダは、インターフェースとその具体的な実装をサービスコンテナにバインドするために使用されます。これにより、依存性注入が可能となり、柔軟な設計が可能となります。
  • イベントのリスニング:
    • サービスプロバイダは、イベントリスナーを登録するためにも使用されます。
  • サービスの初期化:
    • アプリケーション起動時に必要な初期化処理を行うために使用されます。
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // サービスのバインディングを行う場所
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // アプリケーションの初期化処理を行う場所
    }
}

Controllerでinterfaceを使用

コントローラーでHogeInterfaceを使用します。

// app/Http/Controllers/HogeController.php
namespace App\Http\Controllers;

use App\Contracts\HogeInterface;

class HogeController extends Controller
{
    protected $hogeService;

    public function __construct(HogeInterface $hogeService)
    {
        $this->hogeService = $hogeService;
    }

    public function show()
    {
        $result = $this->hogeService->getHoge();
        return response()->json(['message' => $result]);
    }
}

「app/Http/Controllers/HogeController.php」を作成します。

ルートの定義

ルートを定義して、コントローラーのメソッドを呼び出せるようにします。

// routes/web.php
use App\Http\Controllers\HogeController;

Route::get('/hoge', [HogeController::class, 'show']);

「/hoge」でHogeControllerのshowメソッドが実行されます。

結果

ブラウザで「https://laravel-app/hoge」にアクセスすると、HogeControllerのshowメソッドが呼び出され、HogeServiceのgetHogeメソッドの結果が表示されます。

{
    "message": "hoge"
}

まとめ

Interface(HogeInterface)を定義し、それを実装するサービス(HogeService)を作成し、サービスプロバイダでバインディングしました。
ControllerHogeController)でそのサービスを使用して、エンドポイントにアクセスしたときに結果を返すようにしました。
この設計により、サービスの実装を変更する場合でも、Interfaceを通じて簡単に置き換えることができ、コードの柔軟性と保守性が向上します。

スポンサードサーチ

ServiceでInterfaceとimplementsを使った例

Interfaceの定義

UserRepositoryInterfaceという名前のInterfaceを作成します。

// app/Repositories/UserRepositoryInterface.php
namespace App\Repositories;

interface UserRepositoryInterface
{
    public function find($id);
    public function all();
}

Interfaceの実装(implementsの使用)

Interfaceを実装するUserRepositoryクラスを作成します。

// app/Repositories/UserRepository.php
namespace App\Repositories;

use App\Models\User;

class UserRepository implements UserRepositoryInterface
{
    public function find($id)
    {
        return User::find($id);
    }

    public function all()
    {
        return User::all();
    }
}

AppServiceProviderでバインディング

AppServiceProvider(プロバイダ)でInterfaceと実装クラスをバインディングします。

// app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\UserRepository;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(UserRepositoryInterface::class, UserRepository::class);
    }

    public function boot()
    {
        //
    }
}

Serviceクラスでinterfaceを使用

Serviceクラスを作成して、リポジトリを利用します。

// app/Services/UserService.php
namespace App\Services;

use App\Repositories\UserRepositoryInterface;

class UserService
{
    protected $userRepository;

    public function __construct(UserRepositoryInterface $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function getUserById($id)
    {
        return $this->userRepository->find($id);
    }

    public function getAllUsers()
    {
        return $this->userRepository->all();
    }
}
icon

Interfaceのを使ったサービス関数のまとめです

  • getUserById($id):UserRepositoryを使用して指定されたIDのユーザーを取得
  • getAllUsers():UserRepositoryを使用して全ユーザーを取得

ControllerでServiceの使用

ControllerでServiceクラスを利用します。

// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Services\UserService;

class UserController extends Controller
{
    protected $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function show($id)
    {
        $user = $this->userService->getUserById($id);
        return response()->json($user);
    }

    public function index()
    {
        $users = $this->userService->getAllUsers();
        return response()->json($users);
    }
}
icon

Serviceを使ったサービス関数のまとめです

  • show($id):UserServiceを使って指定されたIDのユーザー情報を取得
  • index():UserServiceを使って全ユーザー情報を取得

ルートの定義

ルートを定義して、コントローラーのメソッドを呼び出せるようにします。

// routes/web.php

use App\Http\Controllers\UserController;

// 全てのユーザー情報を取得するルート
Route::get('/users', [UserController::class, 'index']);

// 特定のユーザー情報を取得するルート
Route::get('/users/{id}', [UserController::class, 'show']);

結果

URIが/users/の場合

ブラウザで「https://laravel-app/users」にアクセスする、UserControllerのindexメソッドが実行され、
userServiceクラスのgetAllUsersメソッドが実行されます。
getAllUsersメソッドでは、UserRepositoryInterfaceのallメソッドを実行しています。
結果、JSONデータが返ってきます。
※データベースの構造による(省略)

URIが/users/{id}の場合

ブラウザで「https://laravel-app/users/{id}」にアクセスする、UserControllerのshowメソッドが実行され、
userServiceクラスのgetUserByIdメソッドが実行されます。
getUserByIdメソッドでは、UserRepositoryInterfaceのfindメソッドを実行しています。
結果、JSONデータが返ってきます。
※データベースの構造による(省略)

まとめ

  • Interface(UserRepositoryInterface)を作成し、それを実装するクラス(UserRepository)を定義しました。
  • ServiceプロバイダでInterfaceと実装クラスをバインディングし、Serviceクラス(UserService)でリポジトリを利用しました。
  • Controller(UserController)でServiceクラスを使用しました。

Laravel,PHPLaravel

Posted by kami