📅 note公開日:2025-09-21 13:19
🔁 この記事はnoteで公開していた内容をQiitaへ移行・再掲したものです。(必要に応じて加筆修正しています)
アプレンティスシップ10期生第1回目のチームプロジェクトです。
この章ではチームで共有しているプロジェクトのファイル内訳を紐解いていきます。
- ディレクトリー構成図
- MVCとの関係性(このプロジェクトの立ち位置)
- public/index.php
- Railsとの対応表(イメージ掴む用)
- ページアクセス用URL
- Apache/Nginxの設定
- ここまでの“つながり”(全体像)
ディレクトリー構成図
aprentice-team-dev1-10th/
├─ app/
│ ├─ Controllers/
│ │ └─ menuController.php
│ └─ Models/
├─ config/
│ └─ db.php
├─ database/
│ └─ migrations/
│ ├─ 2025_09_15_001_create_all_table.sql
│ └─ 2025_09_15_001_seed_all_data.sql
├─ public/
│ ├─ css/
│ │ ├─ start.css
│ │ ├─ styleset-home.css
│ │ ├─ styleset-input.css
│ │ └─ styleset-login.css
│ ├─ image/
│ │ ├─ logo.png
│ │ ├─ man1.png
│ │ ├─ man2.png
│ │ └─ man3.png
│ ├─ js/
│ │ └─ start.js
│ ├─ index.php
│ ├─ login.html
│ ├─ signup.html
│ └─ start.html
├─ resources/
│ ├─ backend/
│ │ └─ menu_process.php
│ └─ views/
│ ├─ home/
│ │ ├─ home.php
│ │ └─ setting.php
│ ├─ input/
│ │ ├─ eat.php
│ │ └─ menu.php
│ ├─ login.html
│ ├─ set-login/
│ │ ├─ index.php
│ │ ├─ login.php
│ │ ├─ setting.php
│ │ └─ signup.php
│ └─ start.html
├─ Dockerfile
├─ docker-compose.yml
├─ README.md
└─ gitignore
役割メモ(ざっくり)
- public/: ブラウザから直接参照される公開ディレクトリ(エントリーポイント index.php など、静的ファイル:css/js/image)
- app/: 業務ロジック層(Controller / Model)
- resources/views/: 画面テンプレート類(PHP/HTML)
- resources/backend/: 画面以外の処理スクリプト(例:menu_process.php)
- config/: 設定(DB接続など)
- database/migrations/: DB初期化・シード用SQL
- Dockerfile / docker-compose.yml: コンテナ構成
MVCとの関係性(このプロジェクトの立ち位置)
- M(モデル):まだDBは未実装
- V(ビュー):resources/views/…
- C(コントローラー):今は
public/index.phpがフロントコントローラー兼ルータとしてpageの値を見て「どのビュー/処理を呼ぶか」を決めている。
public/index.php
<?php
// ?page=xxx でどのページを表示 ① どのページかを読み取る(リクエスト解析)
$page = $_GET['page'] ?? 'start';
// コンテナ内の絶対パス ② そのページに対応する実ファイルを決める(ルート解決)
$viewsPath = '/var/www/resources/views/';
// ページごとのファイルパス
switch ($page) {
case 'signup':
$file = $viewsPath . 'set-login/signup.php';
break;
case 'login':
$file = $viewsPath . 'set-login/login.php';
break;
case 'index':
$file = $viewsPath . 'set-login/index.php';
break;
case 'start':
$file = $viewsPath . 'start.html';
break;
case 'home':
$file = $viewsPath . 'home/home.php';
break;
case 'home-setting':
$file = $viewsPath . 'home/setting.php';
break;
case 'eat':
$file = $viewsPath . 'input/eat.php';
break;
case 'menu':
$file = $viewsPath . 'input/menu.php';
break;
default:
$file = $viewsPath . 'start.html';
break;
}
// ファイル存在確認
if (file_exists($file)) {
require $file;
} else {
echo "<p>❌ ページが見つかりません</p>";
}
基本認識
①指定がなければstartページが表示される。
$page = $_GET['page'] ?? 'start';
$page = $_GET['page'] ?? 'start';の意味(PHP)
「URLにpageパラメータが無ければstartを使う」という意味。
??はnull合体演算子:左側が「未定義 or null」なら右側を使うという意味。
②非公開
$viewsPath = '/var/www/resources/views/';
$viewsPath = PHPコード内で使う“内部パス”の変数。
/var/www/resources/views/ 配下は URLで直接は見えない非公開の場所 にしておいて、
入口の public/index.php(=フロントコントローラ)から require で読み込む、という構造。
Dockerfileから、/var/www はベースイメージ(OS+Apacheの設定)が用意、
その中の /var/www/resources はあなたがcomposeで“置き場”として作っている、という区別。
要するに:
- 公開物(画像/CSS/JS/入口の index.php)→
/var/www/html(URLから見える)Dockerfile参照 - テンプレートや部品(views)→
/var/www/resources/views(URLからは直接見せない/requireで読む)
Railsとの対応表(イメージ掴む用)
Rails PHP(今回)
routes.rb index.php の switch ($page)
params[:page] $_GET['page']
params[:email] $_POST['email']
session[:user] = ... $_SESSION['user'] = ...(事前に session_start() 必須)
render :new require '.../login.php'
redirect_to '/home' header('Location: /?page=home'); exit;
ページアクセス用URL
基本形:http://localhost:8080
「基本+?+追加パラメータ(キー)」で希望のページへ
例)
http://localhost:8080/?page=login
http://localhost:8080/?page=start
「指定なし or /(ルート)」はstartページへ
例)
http://localhost:8080/ は http://localhost:8080/?page=start と一緒。
Dockerファイルの内容確認
# Dockerfile (Plain PHP, Apache)
FROM php:8.3-apache
# 必要最低限の拡張のみ
RUN docker-php-ext-install pdo pdo_mysql
# URLリライトが必要なら
RUN a2enmod rewrite
WORKDIR /var/www/html
FROM php:8.3-apache
意味: 既に Apache HTTPD と PHP 8.3 が入っている公式イメージを土台にする。
結果: コンテナ起動だけで Apache がリクエストを受け、.php を PHP として実行できる。
RUN docker-php-ext-install pdo pdo_mysql
意味: PHPの拡張機能をビルド・有効化する公式ヘルパー。
- pdo: PHP標準のDB抽象レイヤ(PDOクラスを使えるようにする)
- pdo_mysql: MySQL用のPDOドライバ(new PDO('mysql:host=...') が使える)
結果: PHPコードから MySQL へ安全に接続できるようになる。
RUN a2enmod rewrite
意味: Apache の mod_rewrite をONにする(a2enmod は有効化コマンド)。
用途: /login → 内部で index.php?page=login に回す…などのリライトを可能にする。
注意: .htaccess を使うなら、Apache設定で該当ディレクトリの AllowOverride All が必要。
WORKDIR /var/www/html
Apacheのドキュメントルートと同じ。
意味: 以降の COPY や相対パスの基準をここにする。
結果: public/index.php をここに置けば、http://localhost:8080/ で配信される。Webサーバー(Apache)が「URLで直接アクセスできる公開フォルダ」として扱う場所。
/var/www は Linuxの慣例的なWebコンテンツ用ディレクトリで、php:8.3-apache(Debian系)のApacheはデフォで /var/www/html を公開(DocumentRoot)にしています。つまり /var/www はベースイメージ(OS+Apacheの設定)が用意。
PDOって何? Railsで言い換えると?
PDO(PHP Data Objects) は PHP標準のDBアクセス用ライブラリ(共通インタフェース)。
それ単体は ORMではなく、「接続→SQLを準備→バインド→実行→結果取得」をするための低〜中レベルAPI。
pdo_mysql はその MySQLドライバ。
Railsに例えると:
- ActiveRecord = ORM(モデル定義・バリデーション・関連・マイグレーション…)
- PDO = ActiveRecordの“下の層”にある DBアダプタに相当(ActiveRecord::Base.connection.exec_query(...) に近い使い方)。
つまり ActiveRecord ほど甘やかしてくれないけど、そのぶん