CodeIgniter 4の仕組みを初心者向けにやさしく解説【MVCの基本】
生徒
「先生、CodeIgniter 4を使ってみたいんですが、どういう仕組みで動いているんですか?」
先生
「CodeIgniter 4は、MVCという仕組みを使ってプログラムを整理しています。これを理解すると、開発がとても楽になりますよ。」
生徒
「MVCって何ですか?難しそうですね…」
先生
「大丈夫です。レストランに例えると分かりやすいので、一緒に見ていきましょう!」
1. MVCとは?レストランで例えて理解しよう
MVCとは、Model(モデル)、View(ビュー)、Controller(コントローラー)の頭文字を取ったもので、Webアプリケーションを作るときの設計パターンです。プログラムを役割ごとに分けて整理する方法で、CodeIgniter 4でもこの仕組みを採用しています。
レストランで例えると分かりやすいです。View(ビュー)は、お客さんが見るメニュー表や料理そのものです。つまり、ユーザーが実際に見る画面(HTML)のことを指します。
Controller(コントローラー)は、ウェイターさんです。お客さんの注文を聞いて、キッチンに伝え、できた料理をお客さんに運びます。プログラムでは、ユーザーからのリクエストを受け取り、必要な処理を指示して、結果を画面に表示する役割です。
Model(モデル)は、キッチンです。食材(データ)を扱い、料理(データ処理)を作ります。プログラムでは、データベースとのやり取りやビジネスロジックを担当します。
この3つが連携することで、効率的で分かりやすいプログラムが作れます。それぞれの役割が明確なので、複数人で開発するときも、誰がどこを担当するか分けやすくなります。
2. CodeIgniter 4のフォルダ構成を理解しよう
CodeIgniter 4をインストールすると、いくつかのフォルダが作られます。初心者の方は、まずこの構成を理解することが大切です。主要なフォルダを見ていきましょう。
appフォルダは、あなたが開発するプログラムを置く場所です。この中に、さらにControllers、Models、Viewsというフォルダがあり、それぞれMVCの各要素を配置します。ほとんどの開発作業は、このappフォルダ内で行います。
publicフォルダは、Webブラウザから直接アクセスできる公開フォルダです。この中にindex.phpという入口ファイルがあり、すべてのリクエストはここを通ります。また、CSS、JavaScript、画像などの静的ファイルもここに配置します。
systemフォルダは、CodeIgniter 4本体のプログラムが入っています。基本的にこのフォルダは触りません。フレームワークの核となる機能が詰まっている場所です。
writableフォルダは、ログファイルやキャッシュファイルなど、プログラムが書き込みを行うファイルを保存する場所です。このフォルダには書き込み権限が必要です。
3. Controller(コントローラー)の役割と書き方
Controllerは、MVCの中心的な役割を担います。ユーザーからのリクエストを最初に受け取り、必要に応じてModelからデータを取得し、Viewに渡して画面を表示します。まさにウェイターさんのように、すべてを取りまとめる存在です。
CodeIgniter 4では、Controllerはapp/Controllersフォルダに配置します。ファイル名は大文字で始まり、クラス名と一致させる必要があります。例えば、Home.phpというファイルなら、中身はHomeクラスになります。
以下は、シンプルなControllerの例です。
<?php
namespace App\Controllers;
class Home extends BaseController
{
public function index()
{
// データを準備
$data = [
'title' => 'ホームページ',
'message' => 'CodeIgniter 4へようこそ!'
];
// Viewを表示
return view('home_view', $data);
}
}
このコードでは、HomeクラスがBaseControllerを継承しています。継承とは、親クラスの機能を引き継ぐことです。index()メソッドは、このControllerのデフォルトメソッドで、URLで/homeにアクセスしたときに実行されます。$data配列にデータを入れて、view()関数でViewファイルに渡しています。
4. View(ビュー)でHTMLを作成する
Viewは、ユーザーに表示されるHTML画面を作成する部分です。Controllerから受け取ったデータを使って、動的にHTMLを生成します。デザインやレイアウトに関する部分は、すべてViewに記述します。
Viewファイルは、app/Viewsフォルダに配置します。ファイル名は小文字で、拡張子は.phpです。HTMLの中にPHPコードを埋め込むことができるので、データを表示したり、繰り返し処理をしたりできます。
先ほどのControllerに対応するViewファイルの例を見てみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title><?= $title ?></title>
</head>
<body>
<h1><?= $title ?></h1>
<p><?= $message ?></p>
<p>現在の時刻: <?= date('Y年m月d日 H:i:s') ?></p>
</body>
</html>
= $変数名 ?>という書き方で、Controllerから渡されたデータを表示できます。これはの省略形で、短く書けるので便利です。HTMLの中にPHPを混ぜて書くことで、動的なページが作れます。
Viewには複雑なロジックは書かず、あくまで表示に関することだけを記述するのがポイントです。データの加工や計算は、ControllerやModelで行います。
5. Model(モデル)でデータベースを操作する
Modelは、データベースとのやり取りを担当します。データの保存、取得、更新、削除などの処理を記述します。CodeIgniter 4では、Modelを使うことで、複雑なSQL文を書かなくても、簡単にデータベース操作ができます。
Modelファイルは、app/Modelsフォルダに配置します。ファイル名も大文字で始まり、一般的にテーブル名の単数形を使います。例えば、usersテーブルならUserModel.phpというファイル名にします。
以下は、基本的なModelの例です。
<?php
namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model
{
protected $table = 'users';
protected $primaryKey = 'id';
protected $allowedFields = ['name', 'email', 'age'];
// 全ユーザーを取得するメソッド
public function getAllUsers()
{
return $this->findAll();
}
// 特定のユーザーを取得するメソッド
public function getUserById($id)
{
return $this->find($id);
}
}
$tableには対応するテーブル名、$primaryKeyには主キーのカラム名、$allowedFieldsには更新を許可するカラム名を配列で指定します。findAll()は全データを取得し、find($id)は指定したIDのデータを取得します。
Modelを使うことで、SQLインジェクション対策も自動的に行われるため、セキュリティ面でも安全です。
6. MVCの連携フロー:実際の動きを追ってみよう
ここまでMVC各要素を見てきましたが、実際にユーザーがWebページにアクセスしたとき、どのような流れで処理が進むのか、具体的に見ていきましょう。
まず、ユーザーがブラウザでURLにアクセスします。例えば、http://example.com/users/profile/5というURLにアクセスしたとします。このリクエストは、public/index.phpを通してCodeIgniter 4に渡されます。
次に、ルーティング設定に基づいて、適切なControllerとメソッドが呼び出されます。この場合、Usersコントローラーのprofile()メソッドが実行され、パラメータとして5が渡されます。
Controllerは、必要に応じてModelを呼び出します。UserModelのgetUserById(5)メソッドを呼び出して、データベースからID5のユーザー情報を取得します。
Modelがデータベースに問い合わせて、データを取得します。取得したデータは、ModelからControllerに返されます。
Controllerは、Modelから受け取ったデータを整形し、Viewに渡します。view('profile_view', $data)のように、Viewファイルとデータを指定します。
最後に、ViewがHTMLを生成し、ブラウザに表示されます。ユーザーは、ID5のユーザー情報が表示されたプロフィールページを見ることができます。
7. ルーティング設定でURLとControllerを結びつける
ルーティングとは、URLとControllerのメソッドを結びつける設定のことです。どのURLにアクセスしたときに、どのControllerのどのメソッドを実行するかを決定します。
CodeIgniter 4では、app/Config/Routes.phpファイルでルーティングを設定します。デフォルトでは、/controller名/メソッド名/パラメータという形式でURLが構成されますが、カスタムルートを定義することもできます。
以下は、ルーティング設定の例です。
<?php
// app/Config/Routes.phpでの設定例
$routes->get('/', 'Home::index');
$routes->get('about', 'Pages::about');
$routes->get('contact', 'Pages::contact');
$routes->get('users/(:num)', 'Users::profile/$1');
$routes->post('login', 'Auth::login');
get()はGETリクエスト、post()はPOSTリクエストを処理します。(:num)は数字のパラメータを表し、$1でその値をメソッドに渡せます。例えば、/users/10にアクセスすると、Usersコントローラーのprofile()メソッドに10が渡されます。
カスタムルートを設定することで、分かりやすいURLを作ることができ、SEO対策にもなります。
8. 名前空間(Namespace)の理解
CodeIgniter 4では、名前空間という仕組みを使っています。名前空間とは、クラス名の衝突を避けるための仕組みで、プログラムを整理するために使われます。本棚で例えると、同じタイトルの本でも、棚が違えば区別できるようなものです。
CodeIgniter 4のControllerやModelの先頭には、namespace App\Controllers;やnamespace App\Models;という記述があります。これは、このクラスがどの名前空間に属しているかを示しています。
他のクラスを使うときは、use文でインポートします。例えば、Modelを使うときはuse CodeIgniter\Model;と書きます。これにより、そのクラスを短い名前で使えるようになります。
名前空間を使うことで、大規模なプロジェクトでもクラス名が重複せず、整理された状態を保てます。最初は難しく感じるかもしれませんが、基本的なパターンを覚えれば大丈夫です。
9. CodeIgniter 4の新機能と改善点
CodeIgniter 4は、旧バージョンのCodeIgniter 3から大幅に改善されています。まず、PHP 7.4以上が必須になり、最新のPHP機能を活用できるようになりました。これにより、パフォーマンスが向上し、より安全なコードが書けます。
名前空間のサポートが追加され、モダンなPHP開発のスタイルに対応しました。また、PSR-4オートローディングに対応し、クラスの読み込みが自動化されています。
環境設定の改善も大きな特徴です。.envファイルを使って、開発環境、本番環境などで異なる設定を簡単に切り替えられます。データベースのパスワードなど、機密情報を安全に管理できます。
コマンドラインインターフェース(CLI)も強化され、php sparkコマンドでControllerやModelの雛形を自動生成できます。これにより、開発効率が大幅に向上します。
これらの改善により、CodeIgniter 4は、よりモダンで使いやすいフレームワークになっています。
10. MVCを使うメリットと実践のポイント
MVCパターンを使う最大のメリットは、コードの整理整頓です。それぞれの役割が明確なので、どこに何を書けばいいか迷いません。バグが発生したときも、問題箇所を特定しやすくなります。
チーム開発でも威力を発揮します。デザイナーはViewを、バックエンドエンジニアはModelとControllerを担当するなど、役割分担がしやすくなります。お互いの作業が干渉しにくいので、効率的に開発を進められます。
保守性と拡張性も向上します。機能を追加したり、デザインを変更したりするときも、影響範囲が限定されるので、安心して修正できます。
実践のポイントとしては、Viewには複雑なロジックを書かないことです。データの表示だけに専念させましょう。Modelにはデータベース操作を集約し、Controllerは橋渡し役に徹することが大切です。
最初は慣れないかもしれませんが、MVCの考え方を身につければ、どんなWebアプリケーションでも整理された美しいコードが書けるようになります。CodeIgniter 4でMVCをマスターして、効率的な開発を楽しみましょう。