CakePHP4のメモ
![]() |
13 |
230 views
クリーンアーキテクチャは、ソフトウェアの保守性や拡張性を向上させるためのアーキテクチャパターンで、依存関係の管理を重視しています。この記事では、CakePHP4とクリーンアーキテクチャを組み合わせ、より堅牢でメンテナンス性の高いWebアプリケーションを構築するための方法を紹介します。
クリーンアーキテクチャは、Robert C. Martin(通称:アンクルボブ)が提唱したアーキテクチャで、以下の4つの層に分かれています。
このような層構造により、依存関係が内側から外側に向かって一方向になるように設計され、コアビジネスロジックが外部技術に依存しない構造が実現できます。
CakePHP4はMVCフレームワークであり、クリーンアーキテクチャの概念を直接取り入れることは難しい場合もありますが、以下の方針でアーキテクチャを構築すると、クリーンアーキテクチャの原則に近い構造が作れます。
エンティティ層には、ビジネスロジックとデータの属性を持つエンティティクラスを配置します。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
メソッドを定義し、記事が公開されているかどうかの判断ロジックを持たせます。
ユースケース層は、特定のユースケースに関連するビジネスロジックを処理します。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);
}
}
サービスクラスには、記事の検索や作成ロジックが含まれており、コントローラーからの直接的なデータベース操作を避けることで、ビジネスロジックを統一管理します。
インターフェース層は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
を利用してビジネスロジックを実行しています。コントローラーは単にリクエストを受け、結果をビューに渡す役割を担っています。
リポジトリはデータベースアクセスを抽象化し、データソースが変更されてもビジネスロジックに影響が出ないようにします。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/