CodeIgniter 4入門!コントローラでリクエストを受け取る方法を徹底解説
生徒
「ホームページのフォームに入力された名前や、URLの後ろについているデータって、どうやってプログラムで読み取るんですか?」
先生
「PHPのフレームワークであるCodeIgniter(コードイグナイター)では、『コントローラ』という司令塔がその役割を担います。『リクエスト』という機能を使うんですよ。」
生徒
「リクエスト……なんだか難しそうですね。初心者でも簡単にデータを取得できますか?」
先生
「大丈夫です!専用の道具(メソッド)が用意されているので、書き方さえ覚えれば誰でも使いこなせます。さっそく仕組みを見ていきましょう!」
1. コントローラとリクエストの役割を知ろう
Webサイトを閲覧しているとき、私たちは無意識にサーバーに対して「このページを見せて!」「このデータを保存して!」というお願いを送っています。このお願いのことをプログラミング用語でリクエスト(Request)と呼びます。
CodeIgniter 4において、このリクエストを真っ先に受け取り、「どの処理を行うか」を判断するのがコントローラの役割です。例えるなら、コントローラはレストランの注文を取る「ウェイターさん」のような存在です。お客さん(ユーザー)からの注文内容を確認し、厨房(モデルやデータベース)へ伝えたり、料理(ビュー・画面)を運んだりします。
パソコンを触ったことがない方でもイメージしやすいように言うと、テレビのリモコンで「3チャンネルが見たい」とボタンを押す行為がリクエストで、その信号を受け取って画面を切り替える機械の仕組みがコントローラに当たります。このデータの受け渡しをマスターすることが、Web開発の第一歩です。
2. URLからデータを取得する(GETリクエスト)
まずは、URLの末尾に情報をくっつけて送る方法を学びましょう。これをGET(ゲット)リクエストと言います。検索エンジンの検索結果ページなどで、URLの後ろに「?q=プログラミング」のような文字がついているのを見たことはありませんか?これがGETデータです。
CodeIgniterでは、$this->request->getGet()という命令を使って、この情報を簡単に取り出すことができます。「getGet」と「get」が二回続くのが面白いですね。これは「GETという方式で送られたデータを取得(Get)する」という意味です。
それでは、実際のプログラムコードを見てみましょう。ユーザー名をURLから受け取る簡単な例です。
namespace App\Controllers;
class UserController extends BaseController
{
public function showProfile()
{
// URLの「?name=太郎」といったデータを受け取ります
$name = $this->request->getGet('name');
// もしデータが空っぽだった時のために、初期値を設定することもできます
if (empty($name)) {
$name = 'ゲスト';
}
echo 'こんにちは、' . $name . 'さん!';
}
}
実行結果は次のようになります。URLに ?name=Tech太郎 と入力してアクセスしたと想像してください。
こんにちは、Tech太郎さん!
3. フォームから安全にデータを取得する(POSTリクエスト)
次に、お問い合わせフォームやログイン画面などでよく使われるPOST(ポスト)リクエストについて解説します。GETリクエストはURLにデータが表示されてしまうため、パスワードや個人情報を送るのには向きません。それに対して、POSTリクエストは封筒に手紙を入れるように、外からは見えない形でデータを送ります。
CodeIgniterでは、$this->request->getPost()という命令を使います。使い方はGETとほとんど同じですが、セキュリティ上より安全にデータを扱うことができます。開発現場では、このPOSTリクエストを使ってユーザーの入力値をサーバーに保存する処理を頻繁に行います。以下のコードは、お問い合わせフォームから送られてきたメッセージを表示する例です。
namespace App\Controllers;
class ContactController extends BaseController
{
public function receiveMessage()
{
// フォームから送られた「message」という名前のデータを受け取ります
$userMsg = $this->request->getPost('message');
// 受け取った内容が安全かどうかは別として、まずは画面に表示してみます
echo '届いたメッセージ:' . $userMsg;
}
}
実行結果(メッセージ欄に「こんにちは」と入力して送信した場合):
届いたメッセージ:こんにちは
4. GETとPOSTをまとめて受け取る便利な方法
「GETで送られてくるか、POSTで送られてくるか、どちらかわからないけれどとにかくデータが欲しい!」という場面もたまにあります。そんな時に便利なのが、CodeIgniterが用意してくれているgetVar()という魔法の命令です。Varとは「Variable(変数)」の略称です。
この命令を使うと、システムが自動的にGETとPOSTの両方を確認して、該当するデータを見つけてきてくれます。初心者の方は、まずこのgetVar()を覚えるだけでも、多くのプログラムを動かすことができるようになります。ただし、なんでもこれ一つで済ませるのではなく、データの送り方に合わせて使い分けるのが「プロっぽさ」への近道です。
namespace App\Controllers;
class SearchController extends BaseController
{
public function find()
{
// GETでもPOSTでも、どちらからでも「keyword」を取得します
$word = $this->request->getVar('keyword');
if ($word) {
echo $word . ' について検索を開始します。';
} else {
echo '検索キーワードが入力されていません。';
}
}
}
実行結果(「PHP」と入力して検索した場合):
PHP について検索を開始します。
5. データの有無を確認するバリデーションの基礎
プログラムを作っていると、「必ず入力してほしい項目が空っぽだった」という困った状況に出くわします。ユーザーが悪意を持って変なデータを送ってくることもあります。そこで重要になるのがバリデーション(妥当性確認)という考え方です。リクエストを受け取った直後に、「そのデータは正しいか?」をチェックします。
例えば、年齢を入力する欄に「あいうえお」という文字が入っていたら計算ができませんよね。CodeIgniterには、こうしたチェックを自動で行う強力な機能が備わっています。今回は最もシンプルな形として、データが存在するかどうかをif文で確認するコードを見てみましょう。これにより、エラーで画面が真っ白になるのを防ぐことができます。
6. 複数のデータを一気に取得する方法
住所、氏名、電話番号、メールアドレス……。たくさんの入力項目がある場合、一つずつgetPost()を書くのは大変です。そんな時は、引数を空にして呼び出すことで、すべてのデータを「連想配列(れんそうはいれつ)」というセットにして受け取ることができます。配列とは、一つの箱の中に複数のデータが入っている状態のことです。
これを使えば、一度の命令で大量の情報を整理整頓された形で扱うことができ、コードが非常にスッキリします。プログラミング未経験の方は「一気に受け取る方法があるんだな」くらいに覚えておけば十分です。実際の開発では、この受け取った配列をそのままデータベースに保存する、という流れが一般的です。
namespace App\Controllers;
class MemberController extends BaseController
{
public function register()
{
// 全てのリクエストデータを一括で取得します
$allData = $this->request->getPost();
// データの個数を確認してみましょう
echo '受け取ったデータの項目数は ' . count($allData) . ' 個です。';
// 中身を詳しく見てみるための命令(デバッグ用)
print_r($allData);
}
}
7. JSON形式のリクエストを受け取る
最近のWeb開発では、スマホアプリやJavaScriptなどからデータを送る際、JSON(ジェイソン)という特殊な形式が使われることが増えています。これは、通常のフォーム送信とは少し仕組みが異なり、文字列を構造化して送る方法です。
CodeIgniter 4はこうした最新の技術にもしっかり対応しており、getJSON()という命令一発で、JSONデータをプログラムで扱いやすいオブジェクト形式に変換してくれます。初心者の方には少しハードルが高いかもしれませんが、「時代の流れに合わせた受け取り方もある」ということを知っておくだけで、将来応用が利くようになります。API開発と呼ばれる分野では、この手法が主役になります。
8. 入力データの安全性を高める(サニタイズ)
最後に、とても大切な「安全」の話をします。ユーザーから送られてきたデータには、ウイルスのような悪意あるプログラムが混じっている可能性があります。これをそのまま表示すると、自分のサイトが乗っ取られたり、他の利用者に迷惑をかけたりすることになりかねません。
CodeIgniterのリクエスト機能には、こうした危険な文字を無害化するフィルター機能が備わっています。例えばgetPost('data', FILTER_SANITIZE_SPECIAL_CHARS)のように書くことで、危険な記号を安全な文字に置き換えることができます。初心者であっても、「外から来たデータはそのまま信じない」というセキュリティ意識を持つことが、立派なエンジニアへの近道です。
このように、CodeIgniterのコントローラでリクエストを適切に処理することで、ユーザーと対話できる動的なWebサイトが完成します。まずはGETやPOSTの基本から少しずつ慣れていきましょう!