CodeIgniterのフォーム処理を徹底解説!初心者でもわかるViewとControllerの連携
生徒
「CodeIgniterで、ユーザーが文字を入力できる画面を作りたいのですが、どうすればいいですか?」
先生
「それには『フォーム』という機能を使います。入力画面のView(ビュー)と、データを受け取るController(コントローラー)を連携させるのが基本ですよ。」
生徒
「画面と裏側のプログラムを分けるんですね。難しそうですが、私にもできますか?」
先生
「大丈夫です!CodeIgniterには便利な道具がたくさん用意されています。まずは仕組みから順番に学んでいきましょう!」
1. フォーム処理の全体像を知ろう
Webサイトで「お問い合わせ」や「会員登録」をする際に、名前やメールアドレスを入力する枠がありますよね。あれをフォームと呼びます。プログラミング未経験の方にとって、画面に入力した文字がどうやってコンピュータに伝わるのかは不思議に感じるかもしれません。
CodeIgniter(コードイグナイター)というPHPのフレームワークでは、役割分担がハッキリしています。まず、ユーザーが見る見た目の部分をView(ビュー)が担当し、送られてきたデータをどう処理するかを判断する司令塔をController(コントローラー)が担当します。この2つがキャッチボールをすることで、私たちが普段使っているWebサービスは動いています。まずは、この「画面」と「処理」のペアを作るというイメージを大切にしてください。
2. Viewで入力画面を作成する
まずは、ユーザーが文字を打ち込むための「箱」を画面に表示させましょう。CodeIgniterでは、HTMLという言葉を使って画面を作ります。ここでは「お名前」を入力して送信するだけのシンプルな画面を作ってみます。パソコンを触ったことがない方でも、以下のコードを真似して書くことで、入力欄とボタンが表示されます。
form_openという便利な機能を使うと、データの送り先を自動的に設定してくれます。これはCodeIgniter独自の便利な「魔法の言葉」のようなものです。
<!DOCTYPE html>
<html>
<head>
<title>初めてのフォーム</title>
</head>
<body>
<h2>お名前を教えてください</h2>
<form action="confirm" method="post">
<input type="text" name="username" placeholder="名前を入力">
<button type="submit">送信する</button>
</form>
</body>
</html>
このコードの中にあるmethod="post"というのは、「データをこっそり裏側で送る」という通信の決まりごとです。手紙を封筒に入れて送るようなものだと考えてください。反対に、URLにデータが見えてしまう送り方を「GET」と呼びますが、フォームでは「POST」を使うのが一般的です。
3. Controllerでデータを受け取る準備
画面から「送信ボタン」が押されたとき、そのデータを受け止めるのがコントローラーの役割です。コントローラーは、まるで会社の受付嬢のような存在です。届いた書類(データ)を確認し、適切な部署へ回す指示を出します。
CodeIgniterでは、クラスという大きな箱の中に、メソッドと呼ばれる具体的な「命令」を書いていきます。今回は「index」という命令で入力画面を表示し、「confirm」という命令で届いたデータを確認する流れを作ります。
<?php
// Controllerファイル: app/Controllers/FormController.php
namespace App\Controllers;
class FormController extends BaseController {
// 入力画面を表示するメソッド
public function index() {
return view('form_input');
}
// 送信されたデータを受け取るメソッド
public function confirm() {
// フォームから送られた「username」というデータを取り出す
$name = $this->request->getPost('username');
// 画面に表示するためにデータを準備する
$data['user_name'] = $name;
return view('form_result', $data);
}
}
ここで重要なのは$this->request->getPost('username')という部分です。これは「POSTで送られてきたデータの中から、名前がusernameになっている中身を取ってきて!」というコンピュータへの指示になります。変数(データを一時的に入れる箱)である$nameに、ユーザーが入れた文字が代入されます。
4. 受け取った結果を画面に表示する
コントローラーが受け取ったデータを、今度は「結果画面」としてユーザーに返してあげましょう。別のViewファイルを作成し、そこに受け取った名前を表示させます。プログラミングでは、一度受け取った情報を加工して、再び画面に出すことで「対話」をしているように見せています。
<!DOCTYPE html>
<html>
<head>
<title>送信結果</title>
</head>
<body>
<h2>受付完了</h2>
<p>ようこそ、<?php echo $user_name; ?> さん!</p>
<p><a href="/formcontroller">入力画面に戻る</a></p>
</body>
</html>
$user_nameという部分は、先ほどコントローラーで用意したデータが入っています。例えば、入力画面で「田中」と入力して送信すれば、この画面では「ようこそ、田中 さん!」と表示されます。このように、中身が状況によって変わる文字のことをプログラミングでは「変数(へんすう)」と呼びます。
5. ルーティングでURLを設定する
画面とコントローラーを作っても、それらをどうやって呼び出すかを決めなければ動きません。これをルーティングと呼びます。ルーティングは、道路の標識のようなものです。「この住所(URL)に来たら、このコントローラーのこの命令を実行してね」という道案内を記述します。
CodeIgniterでは、app/Config/Routes.phpというファイルに設定を書きます。これを正しく書かないと、画面を表示しようとしても「404 Not Found(そんなページはありません)」というエラーが出てしまいます。
// app/Config/Routes.php の中に追記
$routes->get('form', 'FormController::index');
$routes->post('form/confirm', 'FormController::confirm');
$routes->getはページを読み込むとき、$routes->postはフォームを送信したときに使われます。これで、ブラウザで「自分のサイト/form」にアクセスすれば、私たちが作ったフォームが表示されるようになります。
6. バリデーションで入力をチェックする
最後に、とても大切な「バリデーション」という仕組みを解説します。バリデーションとは、日本語で「入力チェック」のことです。例えば、名前が空欄のまま送信されたり、メールアドレスの形式が間違っていたりしたときに、「正しく入力してください」と注意を促す機能です。
これをしないと、システムに不具合が起きたり、悪意のある入力によってサイトが壊されたりする危険があります。初心者の方は、「ユーザーは必ずしも正しく入力してくれるとは限らない」ということを覚えておきましょう。CodeIgniterには、このチェックを自動で行ってくれる非常に強力な機能が備わっています。今回は、名前が未入力でないかを確認する簡単なルールを追加してみましょう。
// バリデーションを取り入れたControllerの例
public function confirm() {
// 入力ルールを決める(必須入力、3文字以上など)
$rules = [
'username' => 'required|min_length[3]'
];
if (!$this->validate($rules)) {
// もしルールに合格しなかったら、元の画面に戻す
return view('form_input', ['errors' => $this->validator->getErrors()]);
}
// 合格なら結果画面へ
$name = $this->request->getPost('username');
return view('form_result', ['user_name' => $name]);
}
このように、required(必須)などの条件を指定するだけで、プログラムが自動でチェックしてくれます。これにより、安全で使いやすいWebアプリケーションを作ることができるのです。最初は難しく感じるかもしれませんが、一つ一つの積み重ねが大きなシステムへと繋がっていきます。