Windowsで始めるCakePHP4

CakePHP4のメモ

13

230 views

概要

クリーンアーキテクチャは、ソフトウェアの保守性や拡張性を向上させるためのアーキテクチャパターンで、依存関係の管理を重視しています。この記事では、CakePHP4とクリーンアーキテクチャを組み合わせ、より堅牢でメンテナンス性の高いWebアプリケーションを構築するための方法を紹介します。

クリーンアーキテクチャとは?

クリーンアーキテクチャは、Robert C. Martin(通称:アンクルボブ)が提唱したアーキテクチャで、以下の4つの層に分かれています。

  1. エンティティ層:ビジネスルールやコアロジックが含まれ、アプリケーションに依存しない層です。
  2. ユースケース層(インタラクタ層):ビジネスルールとアプリケーションの操作を定義し、具体的なユースケースを提供します。
  3. インターフェース層:外部システムやフレームワークとのインターフェースを担当します。
  4. インフラストラクチャ層:フレームワークやデータベースなど、アプリケーションが動作するために必要な具体的な技術が含まれます。

このような層構造により、依存関係が内側から外側に向かって一方向になるように設計され、コアビジネスロジックが外部技術に依存しない構造が実現できます。

CakePHP4でのクリーンアーキテクチャ実装の基本方針

CakePHP4はMVCフレームワークであり、クリーンアーキテクチャの概念を直接取り入れることは難しい場合もありますが、以下の方針でアーキテクチャを構築すると、クリーンアーキテクチャの原則に近い構造が作れます。

  1. エンティティ層:モデルのエンティティクラスでビジネスルールを定義し、データに関するロジックを統一する。
  2. ユースケース層:サービスクラスやユースケースクラスを使って、具体的なユースケースに沿ったビジネスロジックを管理する。
  3. インターフェース層:コントローラーでHTTPリクエストやレスポンスを処理し、サービスクラスとやりとりする。
  4. インフラストラクチャ層:リポジトリやデータベース操作を担当し、データソースへのアクセスを抽象化する。

CakePHP4でクリーンアーキテクチャを構築する手順

ステップ1:エンティティ層の作成

エンティティ層には、ビジネスロジックとデータの属性を持つエンティティクラスを配置します。CakePHPでは、src/Model/Entityディレクトリにエンティティクラスが生成されるため、必要なロジックをそこに配置します。

namespace App\Model\Entity;

use Cake\ORM\Entity;

class Article extends Entity
{
    protected $_accessible = [
        'title' => true,
        'body' => true,
        'status' => true,
        'created' => true,
        'modified' => true,
    ];

    // ビジネスロジックの例
    public function isPublished(): bool
    {
        return $this->status === 'published';
    }
}

エンティティクラスにisPublishedメソッドを定義し、記事が公開されているかどうかの判断ロジックを持たせます。

ステップ2:ユースケース層(サービス層)の構築

ユースケース層は、特定のユースケースに関連するビジネスロジックを処理します。CakePHP4では、サービスクラスを新規作成してユースケース層として利用できます。

src/Service/ArticleService.phpを作成し、記事の取得やビジネスロジックを統合します。

namespace App\Service;

use App\Model\Table\ArticlesTable;
use Cake\ORM\TableRegistry;

class ArticleService
{
    protected $articles;

    public function __construct()
    {
        $this->articles = TableRegistry::getTableLocator()->get('Articles');
    }

    public function getPublishedArticles()
    {
        return $this->articles->find('all')
            ->where(['status' => 'published'])
            ->all();
    }

    public function createArticle($data)
    {
        $article = $this->articles->newEntity($data);
        if ($article->getErrors()) {
            throw new \InvalidArgumentException('入力エラー');
        }
        return $this->articles->save($article);
    }
}

サービスクラスには、記事の検索や作成ロジックが含まれており、コントローラーからの直接的なデータベース操作を避けることで、ビジネスロジックを統一管理します。

ステップ3:インターフェース層の構築

インターフェース層はCakePHP4のコントローラーが担当します。コントローラーでリクエストを受け取り、サービス層を通じてデータ操作を行います。

ArticlesController.phpを以下のように記述し、サービス層と連携させます。

namespace App\Controller;

use App\Controller\AppController;
use App\Service\ArticleService;

class ArticlesController extends AppController
{
    protected $articleService;

    public function initialize(): void
    {
        parent::initialize();
        $this->articleService = new ArticleService();
    }

    public function index()
    {
        $articles = $this->articleService->getPublishedArticles();
        $this->set(compact('articles'));
    }

    public function add()
    {
        if ($this->request->is('post')) {
            try {
                $this->articleService->createArticle($this->request->getData());
                $this->Flash->success(__('記事が追加されました。'));
                return $this->redirect(['action' => 'index']);
            } catch (\InvalidArgumentException $e) {
                $this->Flash->error($e->getMessage());
            }
        }
    }
}

ここでは、ArticleServiceを利用してビジネスロジックを実行しています。コントローラーは単にリクエストを受け、結果をビューに渡す役割を担っています。

ステップ4:インフラストラクチャ層(リポジトリ層)の構築

リポジトリはデータベースアクセスを抽象化し、データソースが変更されてもビジネスロジックに影響が出ないようにします。CakePHPではTableクラスを利用し、リポジトリとしてデータの操作を行います。

namespace App\Model\Table;

use Cake\ORM\Table;

class ArticlesTable extends Table
{
    public function initialize(array $config): void
    {
        parent::initialize($config);
        $this->addBehavior('Timestamp');
    }

    // 例えば、特定のカテゴリに属する記事を取得するメソッド
    public function findByCategory($categoryId)
    {
        return $this->find('all')
            ->where(['category_id' => $categoryId]);
    }
}

ここでは、ArticlesTableクラスにカテゴリによる絞り込み機能を持たせています。リポジトリ層はSQLを使った直接操作を担当し、データソースに関する処理を一元管理します。

クリーンアーキテクチャでのテストと拡張性

クリーンアーキテクチャをCakePHPで実現することにより、テストが容易になります。ビジネスロジックがコントローラーから独立しているため、サービスクラスを単体テストで検証でき、コントローラーとデータベース依存のないテストが可能です。

まとめ

クリーンアーキテクチャを取り入れることで、CakePHP4アプリケーションの拡張性や保守性が大幅に向上します。ビジネスロジックをサービス層に分離し、データベースアクセスはリポジトリ層に限定することで、柔軟な設計とセキュアなアプリケーション開発が実現可能です。CakePHPのMVC構造にクリーンアーキテクチャの概念を組み合わせて、より堅牢でメンテナンスしやすいアプリケーションを構築しましょう。

Page 33 of 34.

前のページ 次のページ



[添付ファイル]

1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll  


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626