作成日: 2023/04/24
0

Laravelでよく使うデザインパターン

LaravelはPHP言語で開発されたフレームワークで、MVCアーキテクチャに基づいて構築されています。Laravelは、デザインパターンを活用することで、開発効率を向上させ、より柔軟でメンテナンス性の高いアプリケーションを開発することができます。

この記事では、Laravelでよく使うデザインパターンについて解説します。

1. Repositoryパターン

Repositoryパターンは、データベースからデータを取得し、ビジネスロジックに基づいて加工したり、データを保存する機能を持つクラスのことを指します。これにより、ビジネスロジックとデータアクセス層を分離することができ、コードの可読性や保守性が向上します。

Laravelでは、Repositoryパターンを実装するために、Eloquent ORM(Object Relational Mapping)を使用することができます。Eloquent ORMは、データベース操作を簡単に行うことができるツールであり、データベースから取得したデータをモデルクラスにマッピングすることができます。

以下は、Repositoryパターンを使ったサンプルコードです。

interface UserRepositoryInterface
{
    public function getAll();
}

class UserRepository implements UserRepositoryInterface
{
    public function getAll()
    {
        return User::all();
    }
}

class UserController extends Controller
{
    protected $userRepository;

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

    public function index()
    {
        $users = $this->userRepository->getAll();

        return view('users.index', compact('users'));
    }
}

上記のコードでは、UserRepositoryInterfaceを実装したUserRepositoryクラスを定義し、そのクラスでEloquent ORMを使用してデータベースにアクセスしています。また、コントローラークラスで、indexメソッドを定義し、userRepositoryをパラメーターとして受け取り、そのリポジトリからデータを取得して、ビューに渡しています。

2. Factoryパターン

Factoryパターンは、オブジェクトの生成を行うクラスを定義し、そのクラスでオブジェクトの生成を抽象化することで、コードの柔軟性を高めるデザインパターンです。Laravelでは、Factoryパターンを用いて、様々なオブジェクトの生成を変えることができます。

以下は、Factoryパターンを使ったサンプルコードです。

class Person
{
   public $name;
   public function __construct($name)
   {
       $this->name = $name;
   }
}

class PersonFactory
{
   public function create($name)
   {
       return new Person($name);
   }
}

$personFactory = new PersonFactory;

$person1 = $personFactory->create('John');
$person2 = $personFactory->create('Jane');

上記のコードでは、Personクラスを定義し、そのPersonクラスの生成を行うPersonFactoryクラスを定義しています。PersonFactoryクラスは、createメソッドでPersonクラスを生成することができます。

3. Dependency Injectionパターン

Dependency Injectionパターンは、オブジェクトが必要とする依存関係を外部から注入することで、オブジェクトのテスト可能性を向上させるデザインパターンです。Laravelでは、Dependency Injectionパターンを使うことで、依存関係を解決し、柔軟なコードを書くことができます。

以下は、Dependency Injectionパターンを使ったサンプルコードです。

class ExampleController extends Controller
{
    protected $exampleService;

    public function __construct(ExampleService $exampleService)
    {
        $this->exampleService = $exampleService;
    }

    public function index()
    {
        $data = $this->exampleService->getData();
        return view('example.index', compact('data'));
    }
}

上記のコードでは、ExampleControllerクラスのコンストラクタで、ExampleServiceクラスを注入しています。これにより、ExampleControllerクラス内でExampleServiceを使用することができます。

4. Strategyパターン

Strategyパターンは、アルゴリズムごとに別々のクラスを作成し、実行時に切り替えることで、アルゴリズムを柔軟に変更することができるデザインパターンです。Laravelでは、Strategyパターンを使って、アプリケーションの振る舞いを変更することができます。

以下は、Strategyパターンを使ったサンプルコードです。

interface ShippingStrategyInterface
{
    public function calculate();
}

class FedexShippingStrategy implements ShippingStrategyInterface
{
    public function calculate()
    {
        // Calculate shipping cost using Fedex API
    }
}

class UPSShippingStrategy implements ShippingStrategyInterface
{
    public function calculate()
    {
        // Calculate shipping cost using UPS API
    }
}

class ShippingCostCalculator
{
    protected $shippingStrategy;

    public function __construct(ShippingStrategyInterface $shippingStrategy)
    {
        $this->shippingStrategy = $shippingStrategy;
    }

    public function calculate()
    {
        return $this->shippingStrategy->calculate();
    }
}

$shippingStrategy = new FedexShippingStrategy;
$shippingCostCalculator = new ShippingCostCalculator($shippingStrategy);
$shippingCost = $shippingCostCalculator->calculate();

上記のコードでは、ShippingStrategyInterfaceを実装したFedexShippingStrategyクラスと、UPSShippingStrategyクラスを定義し、それらのクラスでShippingCostCalculatorクラスを使用しています。ShippingCostCalculatorクラスは、ShippingStrategyInterfaceを持つ依存関係を注入することで、注入されたStrategyクラスでcalculateメソッドを使用して、違うアルゴリズムを変更することができます。

5. Template Methodパターン

Template Methodパターンは、スーパークラスでアルゴリズムの骨格を定義し、サブクラスでアルゴリズムの具体的な実装を行うことで、コードを柔軟にすることができるデザインパターンです。Laravelでは、Template Methodパターンを使って、共通の機能を定義することができます。

以下は、Template Methodパターンを使ったサンプルコードです。

abstract class AbstractClass
{
    public function commonMethod()
    {
        // Common method implemented here
    }

    protected abstract function specificMethod();
}

class ConcreteClass extends AbstractClass
{
    protected function specificMethod()
    {
        // Specific method implemented here
    }
}

$object = new ConcreteClass;
$object->commonMethod();
$object->specificMethod();

上記のコードでは、AbstractClassクラスで共通の機能を定義し、ConcreteClassクラスで抽象メソッドspecificMethodを実装しています。ConcreteClassクラスは、AbstractClassクラスを継承し、AbstractClassで定義された共通の機能を継承します。

まとめ

以上、Laravelでよく使うデザインパターンについて解説しました。デザインパターンを活用することで、コードの柔軟性と保守性を高めることができます。Laravelは、デザインパターンを使うことで、コードの明示性を高め、メンテナンス性に優れたアプリケーションを構築することができます。

参考リンク:


フルスタックエンジニア。徒然なるままに記事を投稿していきます。日々学習。