CodeIgniterのディレクトリ構成を図解で理解しよう
生徒
「先生、CodeIgniterをインストールしたんですが、たくさんフォルダがあって何がどこにあるか分かりません…」
先生
「最初は混乱しますよね。でも、CodeIgniterのディレクトリ構成には明確な役割があって、理解すれば開発がとても楽になりますよ。」
生徒
「どのフォルダに何を置けばいいんですか?」
先生
「一つずつ見ていきましょう。図書館の本棚に例えると分かりやすいですよ!」
1. CodeIgniterのディレクトリ構成の全体像
CodeIgniterをインストールすると、プロジェクトフォルダの中にいくつかのフォルダとファイルが作成されます。これらは、図書館の本棚のように、それぞれ役割ごとに整理されています。どこに何があるかを知っておくと、ファイルを探すときや新しいファイルを作るときに迷いません。
主要なフォルダは、app、public、system、writableの4つです。それぞれのフォルダには明確な役割があり、開発者が適切な場所にファイルを配置することで、整理されたプロジェクトを維持できます。
ディレクトリ構成を理解することは、CodeIgniterを使いこなす第一歩です。どのフォルダを編集するのか、どのフォルダは触らないのかを知ることで、安全に開発を進められます。
ディレクトリとは、フォルダのことです。ファイルを整理して保存する入れ物だと考えてください。プログラミングの世界では「ディレクトリ」という呼び方がよく使われます。
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フォルダ:設定ファイルの保管場所
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フォルダ:外部公開されるファイル
publicフォルダは、Webブラウザから直接アクセスできる唯一のフォルダです。お店で例えると、お客さんが入れる店舗フロアのようなもので、バックヤード(他のフォルダ)には入れません。
このフォルダの中には、index.phpという重要なファイルがあります。これは、すべてのリクエストの入口となるファイルで、ユーザーがどのURLにアクセスしても、最初にこのファイルが実行されます。プログラムの玄関口だと考えてください。
また、publicフォルダには、CSS、JavaScript、画像などの静的ファイルも配置します。これらのファイルは、ブラウザから直接読み込まれる必要があるため、公開フォルダに置く必要があります。一般的に、css、js、imagesというサブフォルダを作って、それぞれのファイルタイプを分類します。
セキュリティの観点から、重要なプログラムファイルや設定ファイルは、publicフォルダの外に配置します。これにより、外部から直接アクセスされるリスクを減らせます。
本番環境では、Webサーバーのドキュメントルート(公開フォルダ)をpublicフォルダに設定することで、セキュリティが大幅に向上します。
5. systemフォルダ:CodeIgniterの心臓部
systemフォルダには、CodeIgniterフレームワーク本体のプログラムが入っています。車で例えると、エンジンルームのようなもので、普段は開けて触ることはありません。このフォルダは、フレームワークのコア機能が詰まっている重要な場所です。
systemフォルダの中には、データベース操作、セキュリティ機能、セッション管理、バリデーション機能など、Webアプリケーション開発に必要な様々な機能が実装されています。これらの機能は、すでにCodeIgniterの開発者によって作られているので、私たちは使うだけで大丈夫です。
基本的にsystemフォルダは編集しません。ここを変更してしまうと、フレームワーク全体の動作に影響を与える可能性があります。また、CodeIgniterをバージョンアップするときに、変更内容が失われてしまうこともあります。
もしフレームワークの機能を拡張したい場合は、systemフォルダを直接編集するのではなく、appフォルダ内でカスタムクラスを作成して、既存の機能を継承する方法を使います。これにより、安全に機能を拡張できます。
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フォルダ:品質を守るテストコード
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フォルダ:外部ライブラリの倉庫
vendorフォルダは、Composerでインストールした外部ライブラリが保存される場所です。スーパーマーケットで例えると、他社から仕入れた商品を置く棚のようなものです。このフォルダは、Composerを使ってCodeIgniterをインストールした場合に作成されます。
外部ライブラリとは、他の開発者が作った便利なプログラムのことです。例えば、PDFを生成するライブラリや、メールを送信するライブラリなど、様々な機能を追加できます。これらをゼロから自分で作る代わりに、既存のライブラリを使うことで開発時間を大幅に短縮できます。
vendorフォルダの中身は、Composerが自動的に管理します。手動でファイルを追加したり削除したりする必要はありません。新しいライブラリが必要になったら、composer requireコマンドを使ってインストールします。
このフォルダも、基本的には直接編集しません。ライブラリのバージョン管理はすべてComposerに任せることで、依存関係の問題を避けられます。
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. ディレクトリ構成を活かした効率的な開発
CodeIgniterのディレクトリ構成を理解したら、それを活かして効率的に開発を進めましょう。まず、ファイル命名規則を守ることが大切です。Controllerファイルは大文字で始まり、Modelファイルも大文字で始めます。Viewファイルは小文字で命名するのが一般的です。
フォルダの階層を深くしすぎないことも重要です。例えば、Viewsフォルダの中に、さらにサブフォルダを作って整理することはできますが、あまり深くすると管理が複雑になります。適度な階層を保ちましょう。
関連するファイルは近くに配置する工夫も効果的です。例えば、商品管理に関するControllerとModelとViewは、それぞれのフォルダ内で同じような名前をつけておくと、後から見つけやすくなります。
開発が進んでプロジェクトが大きくなっても、最初から整理された構成を維持していれば、迷子になることはありません。ディレクトリ構成は、プログラムの設計図のようなものです。この構成を意識しながら開発を進めることで、保守性の高い、美しいコードが書けるようになります。