学術的からプロフェッショナルへ
学術的MVCからプロフェッショナルなWebアーキテクチャへ(全2回の第1部)
💡 プロフェッショナルとは:理解可能、テスト可能、拡張可能、
安全な構造
長期プロジェクト基盤としてのモジュラー・ミニフレームワークの開発
目標:
このプロジェクトは、スケーラブルなWebアプリケーション開発のための
アーキテクチャ参考資料として機能します。学術的MVC構造からプロフェッショナルな
モジュラーWebアーキテクチャへの段階的な移行を示しています。
最終結果は単一のプロジェクトではなく、以下のような軽量な
ミニフレームワークです:
- 任意のWebプロジェクトの安定した基盤として機能
- 長期的な拡張性を可能にします
- 後の完全なリファクタリングを回避します
「一度正しいシャーシを構築すれば、後はモジュールを交換するだけ。」
出発点:
このコンセプトを実践的に示すため、既存のデモプロジェクトを使用して二つのフェーズで作業します:
フェーズ1:出発点として、私のDemoMVCプロジェクトを使用します - すべての基本的な概念を含む典型的な学術的MVC実装ですが、まだプロフェッショナルな構造を持っていません。
フェーズ2:第二フェーズでは、同じDemoMVCベース上に構築された Demologinプロジェクトを使用しますが、すでに完全なログイン機能が実装されています。
ステージ:
| ステージ | 焦点 | 目標 | フェーズ |
|---|---|---|---|
| 1 | 学術的MVC | 理解 | 1 |
| 2 | フォルダ構造 | セキュリティ&概要 | 1 |
| 3 | Bootstrap&ルーター | インデックス軽減&リクエストフロー | 1 |
| 4 | .htaccess設定 | アクセスセキュリティ(基盤) | 1 |
| (5) | サービス&クラス | 構造&テスト可能性(後日) | 2 |
| (6) | ミニフレームワーク | 長期的スケーラビリティ(後日) | 2 |
👉 各ステージは 独立して機能します👉 「すべてを一からやり直す」瞬間はありません
構造:
目標:セキュリティ&概要、リファクタリングなし
原則:public/のみが公開アクセス可能 – その他すべて保護
プロジェクト/
├─ app/
│ ├─ config/
│ ├─ control/
│ ├─ helper/
│ ├─ model/
│ ├─ Router/
│ ├─ service/
│ ├─ view/
│ └─ bootstrap.php
│ └─ router.php
│ └─ session.php
├─ doc/...
├─ public/ ← 唯一の公開ディレクトリ
│ ├─ css/
│ └─ img/
│ ├─ js/
│ ├─ index.php ← 単一エントリーポイント
├─ sql/
├─ storage/
│ ├─ logs/
│ └─ upload/
└─ README.mdインデックスの軽減:
問題:
学術的MVCでは、index.phpが多すぎることを行います:
- ルーター
- コントローラー
- セキュリティゲート
- ワークフローオーケストレーター
👉 単一障害点(カオス)
目標:
index.phpは以下になります:
- 小規模
- 開始点
- ロジックなし
解決策:
- ルーターの外部化
- 集中化されたブートストラップロジック
- オートローディングの準備
- 明確なリクエストパイプライン
リクエストパイプライン
リクエスト ↓ public/index.php ↓ Bootstrap ↓ ルーター ↓ コントローラー ↓ サービス ↓ ビュー / レスポンス
Bootstrap:
初期化:
- 設定
- セッション
- ヘルパー
- コントローラー&サービス
- モデル&ビュー
ルーター:
タスク:
- URL → コントローラー / アクション
- パラメーターの抽出
- エラーの適切な処理
実装:
- 作成:app/bootstrap.php
- インポートパスをindexから新しいbootstrapに移動
- switch($page)を関数内に埋め込まれたコントローラーに移動
- コントローラーコンテンツをServiceフォルダーに移動し、新しいファイルに分散:
App/services/
│ ├─ AuthService.php
│ ├─ UserService.php
│ ├─ ProfileService.php
│ ├─ SessionService.php
│ └─ UploadService.php- 作成:app/Router/Router.php
- 言語とページチェックをsession.phpからrouter.phpに移動
.htaccessによる安全なアクセス(二ファイル構成)
目標:明確なタスク分離による多層保護
原則:二つの.htaccessファイルが連携して最大限のセキュリティを実現
基本 .htaccess(ルート):
# ベース/.HTACCESS(ルートディレクトリ)
# タスク分離:URLリダイレクト&基本保護
# .HTACCESSファイルの保護
RewriteRule ^\.htaccess$ - [F]
<IfModule mod_rewrite.c>
RewriteEngine On
# すべてのリクエストをPUBLIC/に書き換え
RewriteCond %{REQUEST_URI} !/public/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ public/$1 [QSA,L]
# 静的ファイルを直接配信
RewriteCond %{REQUEST_URI} !/public/
RewriteCond %{REQUEST_FILENAME} !-f
# その他すべてをPUBLIC/INDEX.PHPへ
RewriteRule ^(.*)$ public/index.php [QSA,L]
</IfModule>公開 .htaccess(アプリケーション):
# ベース/PUBLIC/.HTACCESS
# タスク分離:アプリケーションルーティング
RewriteRule ^\.htaccess$ - [F]
<IfModule mod_rewrite.c>
RewriteEngine On
# 既存ファイル/ディレクトリを直接配信
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# その他すべて → INDEX.PHP(フロントコントローラー)
RewriteRule ^ index.php [L]
</IfModule>二ファイル構成の理由:
- 多層セキュリティ:ディレクトリトラバーサルに対する二重保護
- タスク分離:ルートがアクセスを管理、公開がルーティングを管理
- デバッグ:テストと保守が容易
- 柔軟性:環境ごとに適応可能
連携方法:
- ステップ1:ルート.htaccessがすべてのリクエストをpublic/にリダイレクト
- ステップ2:公開.htaccessがファイル/ディレクトリの存在を確認
- ステップ3:静的ファイルを直接配信
- ステップ4:その他すべてをindex.php(フロントコントローラー)へ
👉 フォルダ構造と合わせて、これはプロジェクト全体のセキュリティ基盤を形成します。 機密ファイルが公開されることは決してありません。