ウェブ構造

学術的からプロフェッショナルへ

学術的MVCからプロフェッショナルなWebアーキテクチャへ(全2回の第1部)
💡 プロフェッショナルとは:理解可能、テスト可能、拡張可能、 安全な構造

長期プロジェクト基盤としてのモジュラー・ミニフレームワークの開発

目標:

このプロジェクトは、スケーラブルなWebアプリケーション開発のための アーキテクチャ参考資料として機能します。学術的MVC構造からプロフェッショナルな モジュラーWebアーキテクチャへの段階的な移行を示しています。
最終結果は単一のプロジェクトではなく、以下のような軽量な ミニフレームワークです:

  • 任意のWebプロジェクトの安定した基盤として機能
  • 長期的な拡張性を可能にします
  • 後の完全なリファクタリングを回避します

「一度正しいシャーシを構築すれば、後はモジュールを交換するだけ。」

出発点:

このコンセプトを実践的に示すため、既存のデモプロジェクトを使用して二つのフェーズで作業します:

フェーズ1:出発点として、私のDemoMVCプロジェクトを使用します - すべての基本的な概念を含む典型的な学術的MVC実装ですが、まだプロフェッショナルな構造を持っていません。

フェーズ2:第二フェーズでは、同じDemoMVCベース上に構築された Demologinプロジェクトを使用しますが、すでに完全なログイン機能が実装されています。

ステージ:

ステージ焦点目標フェーズ
1 学術的MVC理解1
2フォルダ構造セキュリティ&概要1
3Bootstrap&ルーターインデックス軽減&リクエストフロー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(フロントコントローラー)へ

👉 フォルダ構造と合わせて、これはプロジェクト全体のセキュリティ基盤を形成します。 機密ファイルが公開されることは決してありません。