カテゴリ: CodeIgniter 更新日: 2026/03/12

CodeIgniterのディレクトリ構成を図解で理解しよう

CodeIgniterのディレクトリ構成を図解で理解しよう
CodeIgniterのディレクトリ構成を図解で理解しよう

先生と生徒の会話形式で理解しよう

生徒

「先生、CodeIgniterをインストールしたんですが、たくさんフォルダがあって何がどこにあるか分かりません…」

先生

「最初は混乱しますよね。でも、CodeIgniterのディレクトリ構成には明確な役割があって、理解すれば開発がとても楽になりますよ。」

生徒

「どのフォルダに何を置けばいいんですか?」

先生

「一つずつ見ていきましょう。図書館の本棚に例えると分かりやすいですよ!」

1. CodeIgniterのディレクトリ構成の全体像

1. CodeIgniterのディレクトリ構成の全体像
1. CodeIgniterのディレクトリ構成の全体像

CodeIgniterをインストールすると、プロジェクトフォルダの中にいくつかのフォルダとファイルが作成されます。これらは、図書館の本棚のように、それぞれ役割ごとに整理されています。どこに何があるかを知っておくと、ファイルを探すときや新しいファイルを作るときに迷いません。

主要なフォルダは、apppublicsystemwritableの4つです。それぞれのフォルダには明確な役割があり、開発者が適切な場所にファイルを配置することで、整理されたプロジェクトを維持できます。

ディレクトリ構成を理解することは、CodeIgniterを使いこなす第一歩です。どのフォルダを編集するのか、どのフォルダは触らないのかを知ることで、安全に開発を進められます。

ディレクトリとは?
ディレクトリとは、フォルダのことです。ファイルを整理して保存する入れ物だと考えてください。プログラミングの世界では「ディレクトリ」という呼び方がよく使われます。

2. appフォルダ:あなたのプログラムが入る場所

2. appフォルダ:あなたのプログラムが入る場所
2. appフォルダ:あなたのプログラムが入る場所

appフォルダは、あなたが開発するプログラムコードを配置する最も重要なフォルダです。図書館で例えると、自分で書いた本を置く専用の棚のようなものです。開発作業の大部分は、このappフォルダ内で行います。

appフォルダの中には、さらにいくつかのサブフォルダがあります。Controllersフォルダには、ユーザーからのリクエストを処理するコントローラーファイルを置きます。Modelsフォルダには、データベース操作を担当するモデルファイルを配置します。Viewsフォルダには、ユーザーに表示するHTML画面のファイルを保存します。

例えば、商品一覧ページを作る場合、ProductController.phpをControllersフォルダに、ProductModel.phpをModelsフォルダに、product_list.phpをViewsフォルダに配置します。このように役割ごとに分けることで、プログラムの見通しが良くなります。


// app/Controllers/ProductController.php の例
<?php
namespace App\Controllers;

class ProductController extends BaseController
{
    public function list()
    {
        // モデルを読み込んでデータを取得
        $model = new \App\Models\ProductModel();
        $data['products'] = $model->getAllProducts();
        
        // ビューを表示
        return view('product_list', $data);
    }
}

このように、Controllerファイルはappフォルダ内のControllersサブフォルダに配置します。namespaceで名前空間を指定し、どのフォルダに属するかを明示します。

3. Configフォルダ:設定ファイルの保管場所

3. Configフォルダ:設定ファイルの保管場所
3. Configフォルダ:設定ファイルの保管場所

appフォルダの中にあるConfigフォルダは、アプリケーションの各種設定ファイルを保存する場所です。レストランで例えると、営業時間、メニュー構成、価格設定などを記録したマニュアルのようなものです。

よく使う設定ファイルとして、Routes.phpがあります。これは、URLとコントローラーを結びつけるルーティング設定を記述するファイルです。例えば、/aboutというURLにアクセスしたときに、どのコントローラーのどのメソッドを実行するかを定義します。

Database.phpでは、データベースの接続情報を設定します。ホスト名、データベース名、ユーザー名、パスワードなど、データベースに接続するために必要な情報をここに記述します。

App.phpには、アプリケーション全体に関わる設定があります。ベースURL、タイムゾーン、言語設定など、アプリケーションの基本的な動作を制御する項目が含まれています。


// app/Config/Routes.phpの設定例
<?php
$routes->get('/', 'Home::index');
$routes->get('about', 'Pages::about');
$routes->get('products', 'ProductController::list');
$routes->get('products/(:num)', 'ProductController::detail/$1');

Configフォルダの設定ファイルを編集することで、アプリケーションの動作を柔軟にカスタマイズできます。

4. publicフォルダ:外部公開されるファイル

4. publicフォルダ:外部公開されるファイル
4. publicフォルダ:外部公開されるファイル

publicフォルダは、Webブラウザから直接アクセスできる唯一のフォルダです。お店で例えると、お客さんが入れる店舗フロアのようなもので、バックヤード(他のフォルダ)には入れません。

このフォルダの中には、index.phpという重要なファイルがあります。これは、すべてのリクエストの入口となるファイルで、ユーザーがどのURLにアクセスしても、最初にこのファイルが実行されます。プログラムの玄関口だと考えてください。

また、publicフォルダには、CSS、JavaScript、画像などの静的ファイルも配置します。これらのファイルは、ブラウザから直接読み込まれる必要があるため、公開フォルダに置く必要があります。一般的に、cssjsimagesというサブフォルダを作って、それぞれのファイルタイプを分類します。

セキュリティの観点から、重要なプログラムファイルや設定ファイルは、publicフォルダの外に配置します。これにより、外部から直接アクセスされるリスクを減らせます。

注意点
本番環境では、Webサーバーのドキュメントルート(公開フォルダ)をpublicフォルダに設定することで、セキュリティが大幅に向上します。

5. systemフォルダ:CodeIgniterの心臓部

5. systemフォルダ:CodeIgniterの心臓部
5. systemフォルダ:CodeIgniterの心臓部

systemフォルダには、CodeIgniterフレームワーク本体のプログラムが入っています。車で例えると、エンジンルームのようなもので、普段は開けて触ることはありません。このフォルダは、フレームワークのコア機能が詰まっている重要な場所です。

systemフォルダの中には、データベース操作、セキュリティ機能、セッション管理、バリデーション機能など、Webアプリケーション開発に必要な様々な機能が実装されています。これらの機能は、すでにCodeIgniterの開発者によって作られているので、私たちは使うだけで大丈夫です。

基本的にsystemフォルダは編集しません。ここを変更してしまうと、フレームワーク全体の動作に影響を与える可能性があります。また、CodeIgniterをバージョンアップするときに、変更内容が失われてしまうこともあります。

もしフレームワークの機能を拡張したい場合は、systemフォルダを直接編集するのではなく、appフォルダ内でカスタムクラスを作成して、既存の機能を継承する方法を使います。これにより、安全に機能を拡張できます。

6. writableフォルダ:書き込み専用の保管庫

6. writableフォルダ:書き込み専用の保管庫
6. writableフォルダ:書き込み専用の保管庫

writableフォルダは、アプリケーションが動作中にファイルを書き込むための場所です。倉庫で例えると、商品の出入りがある在庫保管スペースのようなものです。このフォルダには、必ず書き込み権限が必要です。

writableフォルダの中には、いくつかのサブフォルダがあります。logsフォルダには、エラーログやアクセスログが保存されます。プログラムに問題が発生したとき、このログファイルを見ることで原因を特定できます。

cacheフォルダには、処理を高速化するためのキャッシュファイルが保存されます。一度処理した結果を一時的に保存しておくことで、同じ処理を繰り返す必要がなくなり、パフォーマンスが向上します。

sessionフォルダには、ユーザーのセッション情報が保存されます。セッションとは、ユーザーがサイトを訪問してから離れるまでの一連の操作を追跡するための仕組みです。ログイン状態の維持などに使われます。


// ログファイルへの書き込み例
<?php
log_message('error', 'データベース接続エラーが発生しました');
log_message('info', 'ユーザーがログインしました: user_id=' . $user_id);
log_message('debug', '処理時間: ' . $execution_time . '秒');

このように、log_message()関数を使うと、自動的にwritableフォルダのlogsサブフォルダにログが記録されます。

7. testsフォルダ:品質を守るテストコード

7. testsフォルダ:品質を守るテストコード
7. testsフォルダ:品質を守るテストコード

testsフォルダは、アプリケーションのテストコードを配置する場所です。料理に例えると、味見をして品質をチェックする工程のようなものです。テストコードを書くことで、プログラムが正しく動作しているか自動的に確認できます。

テストには、ユニットテストという種類があります。これは、プログラムの個々の機能が正しく動作するかを確認するテストです。例えば、ユーザー登録の機能を作ったら、そのテストコードも一緒に書きます。

テストを書いておくと、後でプログラムを修正したときに、既存の機能が壊れていないか素早く確認できます。これをリグレッションテストといいます。大規模なプロジェクトでは、テストコードは必須です。


// tests/unit/UserModelTest.phpの例
<?php
namespace Tests\Unit;

use CodeIgniter\Test\CIUnitTestCase;
use App\Models\UserModel;

class UserModelTest extends CIUnitTestCase
{
    public function testUserCreation()
    {
        $model = new UserModel();
        $result = $model->createUser([
            'name' => 'テストユーザー',
            'email' => 'test@example.com'
        ]);
        
        // 結果が正しいか検証
        $this->assertTrue($result);
    }
}

最初はテストコードを書くのが面倒に感じるかもしれませんが、プロジェクトが大きくなるにつれて、その重要性が分かってきます。

8. vendorフォルダ:外部ライブラリの倉庫

8. vendorフォルダ:外部ライブラリの倉庫
8. vendorフォルダ:外部ライブラリの倉庫

vendorフォルダは、Composerでインストールした外部ライブラリが保存される場所です。スーパーマーケットで例えると、他社から仕入れた商品を置く棚のようなものです。このフォルダは、Composerを使ってCodeIgniterをインストールした場合に作成されます。

外部ライブラリとは、他の開発者が作った便利なプログラムのことです。例えば、PDFを生成するライブラリや、メールを送信するライブラリなど、様々な機能を追加できます。これらをゼロから自分で作る代わりに、既存のライブラリを使うことで開発時間を大幅に短縮できます。

vendorフォルダの中身は、Composerが自動的に管理します。手動でファイルを追加したり削除したりする必要はありません。新しいライブラリが必要になったら、composer requireコマンドを使ってインストールします。

このフォルダも、基本的には直接編集しません。ライブラリのバージョン管理はすべてComposerに任せることで、依存関係の問題を避けられます。

9. 設定ファイルと環境変数の管理

9. 設定ファイルと環境変数の管理
9. 設定ファイルと環境変数の管理

プロジェクトフォルダのルート(一番上の階層)には、いくつかの重要な設定ファイルがあります。.envファイルは、環境ごとに異なる設定を管理するためのファイルです。開発環境と本番環境で、データベースの接続情報などを切り替える必要があるときに便利です。

.envファイルには、データベースのパスワードやAPIキーなど、機密情報を記述します。このファイルは、バージョン管理システム(Gitなど)には含めないのが一般的です。.gitignoreファイルに.envを追加しておくことで、誤って公開されるのを防げます。

composer.jsonファイルは、プロジェクトの依存関係やパッケージ情報を定義するファイルです。どのライブラリのどのバージョンが必要かが記述されており、Composerはこのファイルを参照してパッケージをインストールします。


# .envファイルの設定例
CI_ENVIRONMENT = development

app.baseURL = 'http://localhost/myproject/public/'

database.default.hostname = localhost
database.default.database = myapp_db
database.default.username = root
database.default.password = secret123
database.default.DBDriver = MySQLi

環境変数を使うことで、プログラムコードに直接パスワードを書かずに済むため、セキュリティが向上します。

10. ディレクトリ構成を活かした効率的な開発

10. ディレクトリ構成を活かした効率的な開発
10. ディレクトリ構成を活かした効率的な開発

CodeIgniterのディレクトリ構成を理解したら、それを活かして効率的に開発を進めましょう。まず、ファイル命名規則を守ることが大切です。Controllerファイルは大文字で始まり、Modelファイルも大文字で始めます。Viewファイルは小文字で命名するのが一般的です。

フォルダの階層を深くしすぎないことも重要です。例えば、Viewsフォルダの中に、さらにサブフォルダを作って整理することはできますが、あまり深くすると管理が複雑になります。適度な階層を保ちましょう。

関連するファイルは近くに配置する工夫も効果的です。例えば、商品管理に関するControllerとModelとViewは、それぞれのフォルダ内で同じような名前をつけておくと、後から見つけやすくなります。

開発が進んでプロジェクトが大きくなっても、最初から整理された構成を維持していれば、迷子になることはありません。ディレクトリ構成は、プログラムの設計図のようなものです。この構成を意識しながら開発を進めることで、保守性の高い、美しいコードが書けるようになります。

まとめ

まとめ
まとめ

ここまでCodeIgniterのディレクトリ構成について詳しく見てきました。CodeIgniterは軽量で高速に動作するPHPフレームワークとして多くの開発現場で採用されていますが、その使いやすさを支えているのが整理されたディレクトリ構成です。appフォルダを中心にController、Model、Viewを分離するMVC設計は、Webアプリケーション開発の基本であり、保守性や拡張性を高めるための重要な考え方です。 publicフォルダを公開領域として限定し、systemフォルダには手を加えないという原則を守ることで、セキュリティと安定性を確保できます。writableフォルダでログやキャッシュやセッションを管理し、Configフォルダでルーティングやデータベース接続や環境設定を一元管理することで、プロジェクト全体の見通しが良くなります。 また、testsフォルダにユニットテストを配置することで品質を担保し、vendorフォルダでComposerによる外部ライブラリ管理を行うことで、効率的な開発が実現します。さらに.envファイルを活用した環境変数管理は、開発環境と本番環境を安全に切り替えるために欠かせません。 ディレクトリ構成を理解することは、単にフォルダの場所を覚えることではありません。どの役割をどこに書くべきかを理解し、MVCモデルに沿った責務分離を意識することが重要です。CodeIgniterのディレクトリ構成を正しく理解すれば、初心者でも迷わずにWebアプリケーション開発を進めることができ、実務レベルのPHP開発スキルを着実に身につけることができます。

ディレクトリ構成を意識したサンプルプログラム

ここで、ディレクトリ構成を意識した簡単な商品一覧機能の流れを振り返ります。Controllerで処理を受け取り、Modelでデータを取得し、Viewで表示するという基本構造を改めて確認しましょう。


<?php
// app/Controllers/ItemController.php
namespace App\Controllers;

class ItemController extends BaseController
{
    public function index()
    {
        $model = new \App\Models\ItemModel();
        $data['items'] = $model->findAll();
        return view('items/index', $data);
    }
}

<?php
// app/Models/ItemModel.php
namespace App\Models;

use CodeIgniter\Model;

class ItemModel extends Model
{
    protected $table = 'items';
    protected $allowedFields = ['name', 'price'];
}

<!-- app/Views/items/index.php -->
<!DOCTYPE html>
<html>
<head>
    <title>商品一覧</title>
</head>
<body>
    <h1>商品一覧</h1>
    <?php foreach ($items as $item): ?>
        <p><?php echo $item['name']; ?> : <?php echo $item['price']; ?>円</p>
    <?php endforeach; ?>
</body>
</html>

このように、CodeIgniterのディレクトリ構成に従ってファイルを配置することで、役割が明確になり、後から見直したときにも理解しやすい構造になります。Controllerは処理の流れを制御し、Modelはデータベースとやり取りし、ViewはHTML表示を担当します。この責務分離こそが、PHPフレームワークであるCodeIgniterを使う最大のメリットです。

先生と生徒の振り返り会話

生徒

CodeIgniterのディレクトリ構成が最初は複雑に感じていましたが、appフォルダが中心で、ControllerとModelとViewに分かれていると理解できました。MVC設計がなぜ大切なのかも分かってきました。

先生

それは良い理解ですね。Webアプリケーション開発では責務分離がとても重要です。CodeIgniterのディレクトリ構成は、その考え方を自然に身につけられるよう設計されています。

生徒

publicフォルダだけを公開して、systemフォルダは触らないというルールも大切ですね。セキュリティ対策にもつながると分かりました。

先生

その通りです。ディレクトリ構成を正しく理解することは、セキュアなPHP開発の第一歩です。さらに.envファイルやConfig設定を活用すれば、本番環境と開発環境の切り替えも安全に行えます。

生徒

testsフォルダやvendorフォルダの役割も分かりました。テストコードやComposer管理も実務では重要ですね。

先生

そうですね。CodeIgniterのディレクトリ構成を理解しているエンジニアは、保守性の高いWebアプリケーションを構築できます。今回学んだディレクトリ構成の知識は、他のPHPフレームワークやLaravelやSymfonyを学ぶときにも必ず役立ちますよ。

生徒

これからはフォルダの意味を意識しながらコードを書いていきます。CodeIgniterのディレクトリ構成を理解できたことで、PHPフレームワーク開発への不安がかなり減りました。

カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティング構成の基本を完全解説!初心者向けにYAML・PHP・アノテーション方式をやさしく紹介
New2
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法
New3
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
New4
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPで文字列を結合する方法!ドット演算子と代入演算子の使い方を徹底解説
No.2
Java&Spring記事人気No2
PHP
PHPのif文の使い方を完全ガイド!初心者でもわかる条件分岐の基本
No.3
Java&Spring記事人気No3
Laravel
Laravelのresponse()関数の使い方を完全ガイド!初心者でもわかるレスポンス制御とHTTPレスポンスの基本
No.4
Java&Spring記事人気No4
Symfony
Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
No.5
Java&Spring記事人気No5
Laravel
LaravelのAPIルーティングを設定する方法!初心者でもわかるapi.phpの使い方
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterルーティングを完全攻略!正規表現でURLを自由自在に操る方法
No.7
Java&Spring記事人気No7
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.8
Java&Spring記事人気No8
Laravel
LaravelでRemember Me(ログイン状態保持)機能を実装する方法を完全解説!初心者でも安心の認証入門