ウェブ制作

バックエンド

Laravelで
インターフェース実装

お刺身@プログラマー

お刺身@プログラマー

#Oookey_blog_011

Laravelでインターフェース実装

こんにちは。Laravel12リリースで一年の経過を感じたお刺身です!

今回はLaravelインターフェースを実装していきます。
Webアプリケーション開発において、コードの再利用性や保守性を高めるための設計手法は非常に重要です。
Laravelでは、インターフェース、サービスコンテナ、そして依存性注入を組み合わせることで、柔軟かつ拡張性の高いアプリケーション設計が実現できます!

本記事ではこれらの概念の役割と実装の流れを、具体的な「注文金額に応じた割引計算処理」の例を通して解説します。

目次

1. インターフェースの役割
インターフェースとは
2. 注文金額に応じた割引計算の
実装例
インターフェースの定義
具象クラスの実装
サービスコンテナへの
バインディング
コントローラーでの利用例

まとめ

参考サイト

1. インターフェースの役割

インターフェースとは

PHPにおけるインターフェースは、クラスが実装すべきメソッドのシグネチャ(名前、引数、戻り値)を定義する契約(contract)です。 インターフェース自体は具体的な実装を持たず、具象クラスがその契約に基づいて実装を提供します。
その構造により依存性が低く、追加が楽というメリットが存在します。

具象クラスとは
インターフェースで定義されたシグネチャを実装するクラス。インタフェース以外から参照されロジックを利用されることはない。

柔らかく言うと?
・インターフェースにはシグネチャだけ記載するよ!ロジックは書かないよ!
・具象クラスにはインターフェースで実装したいロジックを書くよ!

2. 注文金額に応じた割引計算の
実装例

実際のビジネスロジックとして「注文金額に応じた割引計算」をインターフェースと具象クラスで実装する例を紹介します。

インターフェースの定義

必要なメソッドのシグネチャを定義し、契約(contract)として抽象化
まず、割引計算の契約を定義するインターフェースを作成します。
この例では、注文金額に対して適用する割引額を計算するメソッドを定義します。

Copied!

copyBtn
<?php
namespace App\Contracts;


interface DiscountCalculatorInterface
{
    /**
    * 注文金額に応じた割引額を計算する
    *
    * @param float $amount 注文金額
    * @return float 割引額
    */
    public function calculateDiscount(float $amount): float;
}

具象クラスの実装

インターフェースの契約に基づいて、具体的なビジネスロジックを実装。
次に、上記のインターフェースを実装する具象クラスを作成します。
ここでは、以下のルールに従い実装します。
・注文金額が1,000円以上の場合:10%の割引
・それ以外の場合:5%の割引

Copied!

copyBtn
<?php
namespace App\Services;


use App\Contracts\DiscountCalculatorInterface;


class DefaultDiscountCalculator implements DiscountCalculatorInterface
{
    /**
    * 注文金額に応じた割引額を計算する
    *
    * @param float $amount 注文金額
    * @return float 割引額
    */
    public function calculateDiscount(float $amount): float
    {
        if ($amount >= 1000) {
            return $amount * 0.10;
        }
        return $amount * 0.05;
    }
}

サービスコンテナへのバインディング

サービスプロバイダを利用して、インターフェースと具象クラスをバインドします。
これにより、依存性注入時に自動的に DefaultDiscountCalculator が使用されます。

Copied!

copyBtn
<?php
namespace App\Providers;


use Illuminate\Support\ServiceProvider;
use App\Contracts\DiscountCalculatorInterface;
use App\Services\DefaultDiscountCalculator;


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

あるインターフェースに対して複数ある具象クラスから一つを選択・差し替えできるため、仕様変更にも柔軟に対応可能です!

サービスコンテナと依存性注入って?

サービスコンテナとは
Laravelのサービスコンテナは、クラスの依存関係を自動的に解決し、必要なオブジェクトを生成・管理する仕組みです。
依存関係や管理を省き、全体の構造をシンプルにすることができます!

依存性注入とは
依存性注入は、オブジェクトが必要とする依存先(サービスやクラス)を外部から与える設計パターンです。
コンストラクタやセッターメソッドを利用して、必須の依存性をわかりやすく指定することで、クラス間の結合度を下げ、保守性を向上できます!

コントローラーでの利用例

最後にコントローラーで割引計算のビジネスロジックを利用します。
ここでは、コンストラクタインジェクションにより DiscountCalculatorInterface を受け取り、実際の処理を行います。

Copied!

copyBtn
<?php
namespace App\Http\Controllers;


use App\Contracts\DiscountCalculatorInterface;
use Illuminate\Http\Request;


class OrderController extends Controller
{
    protected $discountCalculator;


    public function __construct(DiscountCalculatorInterface $discountCalculator)
    {
        $this->discountCalculator = $discountCalculator;
    }


    /**
    * 注文金額から割引額を計算して返すアクション
    * @param Request $request
    * @return \Illuminate\Http\JsonResponse
    */
    public function store(Request $request)
    {
        $amount = (float)$request->input('amount');
        $discount = $this->discountCalculator->calculateDiscount($amount);
        return view('trial.interface', ['discount' => $discount]);
    }
}

コントローラーは具体的な計算ロジックに依存せずにインターフェースを通じた抽象化を行っているため、処理追加や実装の差し替えやテストが簡単に行うことができます!

まとめ

今回は、Laravelにおけるインターフェースの役割と、サービスコンテナおよび依存性注入の仕組みを通じて、柔軟で保守性の高い設計方法について解説しました。
インターフェースを活用することで、機能拡張や変更にも柔軟かつ堅牢な構築が可能となります。
本記事を読んでくださった皆様に少しでも役に立てたなら嬉しいです!それでは、また。