CodeIgniterのルーティングを徹底解説!ルートパラメータの使い方入門
生徒
「CodeIgniter(コードイグナイター)を使っているのですが、URLの数字や文字をプログラムで受け取るにはどうすればいいですか?」
先生
「それは『ルートパラメータ』という仕組みを使えば解決しますよ。URLの一部を『変数(値を入れる箱)』として扱う方法です。」
生徒
「URLの特定の場所を自由に読み取れるということですね!難しそうですが、私にもできますか?」
先生
「大丈夫です。設定ファイルに少し書き加えるだけで、驚くほど簡単に実装できます。基本から一緒に見ていきましょう!」
1. ルーティングとルートパラメータの基本
CodeIgniter(コードイグナイター)というフレームワークにおいて、ルーティングとは「このURLにアクセスが来たら、このプログラムを動かす」という交通整理のような役割を果たします。通常、Webサイトの住所であるURLは固定されていますが、ブログの記事ページやユーザーのプロフィールページなど、表示する内容によってURLの一部が変わる場合がありますよね。例えば、example.com/blog/1 や example.com/blog/2 といった具合です。
この「1」や「2」といった、状況に応じて変化する部分のことをルートパラメータと呼びます。パラメータとは、プログラムに渡す「材料」のようなものだと考えてください。パソコンに詳しくない方でも、整理整頓された棚をイメージすれば分かりやすいでしょう。「何番の棚(URLの数字)を開けて、中身(データ)を取り出すか」を指示するのがルートパラメータの役割です。
2. プレースホルダ(身代わり)の種類を知ろう
CodeIgniterでは、URLのどの部分をパラメータとして受け取るかを指定するために「プレースホルダ」という特別な記号を使います。これは、本物のデータの代わりに置いておく「予約席の札」のようなものです。主に使われるのは以下の2種類です。
- (:num):数字だけを受け取るときに使います。ID番号などに最適です。
- (:any):数字、文字、記号など、何でも受け取るときに使います。
これらを使い分けることで、「ここは数字しか入らないはずだ」というルールを明確にでき、プログラムの不具合や間違いを防ぐことができます。初心者の方は、まずはこの2つのキーワードを覚えるだけで十分です。PHPの基礎知識がなくても、この書き方さえマスターすればURLを自由に操れるようになります。
3. routes.phpの設定方法
それでは、具体的に設定を書いてみましょう。CodeIgniterの設定ファイルである app/Config/Routes.php を編集します。このファイルは、いわばサイトの「案内図」です。ここに「もし数字のパラメータが来たら、この処理に飛ばしてね」という命令を記述します。
以下のコードは、ブログの記事詳細ページを想定した例です。URLが item/数字 だった場合に、その数字をプログラムに渡す設定です。
// $routes->get('URLのパターン', 'コントローラー名::メソッド名/パラメータ');
$routes->get('product/(:num)', 'Product::show/$1');
ここで出てくる $1 というのは、(:num) で受け取った中身(例えば「10」という数字)をそのまま後ろのプログラムに引き渡すという意味です。これを記述するだけで、URLから情報を抜き出す準備が整います。まるで魔法のようですね。
4. コントローラーでの受け取り方
設定ファイルでルートパラメータを定義したら、次はそれを受け取る「コントローラー」側のプログラムを作成します。コントローラーとは、Webサイトの「司令塔」のことです。パラメータを受け取るには、関数のカッコの中に変数(データの入れ物)を用意するだけです。
プログラミングを始めたばかりの方にとって「変数」という言葉は難しく聞こえるかもしれませんが、単なる「ラベルを貼った箱」だと思ってください。箱の名前は何でも良いのですが、中身が分かりやすい名前にするのがコツです。ここでは $id という名前の箱を使ってみましょう。
namespace App\Controllers;
class Product extends BaseController
{
public function show($id)
{
// $idの中には、URLで指定された数字が入っています
echo "あなたが選んだ商品の番号は " . $id . " です。";
}
}
もしURLが example.com/product/50 であれば、画面には以下のように表示されます。
あなたが選んだ商品の番号は 50 です。
5. 複数のパラメータを同時に扱う方法
時には、URLから2つ以上の情報を抜き出したい場面もあります。例えば「2025年」の「1月」の記事を表示したい場合、URLは archive/2025/01 のようになります。この場合も、ルーティングの設定を少し増やすだけで対応可能です。
設定ファイルでは (:num) を2回使い、渡す側も $1, $2 と順番に指定します。これによって、複数の「予約席」を作ることができます。複雑に見えるかもしれませんが、パズルのピースを組み合わせるような感覚で設定できます。
// 年と月の2つの数字を受け取る設定
$routes->get('archive/(:num)/(:num)', 'Blog::archive/$1/$2');
そして、コントローラー側でも箱を2つ用意します。
public function archive($year, $month)
{
echo $year . "年" . $month . "月の記事一覧を表示します。";
}
実行結果は以下のようになります。
2025年01月の記事一覧を表示します。
6. 文字列を受け取る (:any) の活用
数字だけでなく、ユーザーの名前やカテゴリー名などをURLに含めたいときは (:any) を使います。any は英語で「何でも」という意味がある通り、アルファベットや漢字なども受け取ることができます。
例えば、ユーザーごとのプロフィールページを作る場合を考えてみましょう。URLを user/taro のようにしたい場合に非常に便利です。ただし、何でも受け取れてしまうため、予期せぬ文字が入ってくる可能性も考慮する必要があります。初心者のうちは、まずは「文字も受け取れる便利な設定」として覚えておきましょう。
// ユーザー名などの文字列を受け取る設定
$routes->get('profile/(:any)', 'User::profile/$1');
コントローラーでの記述例です。
public function profile($name)
{
echo "こんにちは、" . $name . "さん!あなたの専用ページです。";
}
URLが profile/tanaka なら、結果は次の通りです。
こんにちは、tanakaさん!あなたの専用ページです。
7. ルートパラメータを使うメリット
なぜ、わざわざルートパラメータを使うのでしょうか?それには大きな理由が3つあります。
- URLが綺麗で見やすくなる(SEO対策):検索エンジンは、シンプルで意味の通じるURLを好みます。パラメータを使うことで、人間にも機械にも優しいサイトになります。
- プログラムが共通化できる:記事が1,000個あっても、プログラムは1つ書くだけで済みます。数字が変わるだけで、中身を自動で切り替えてくれるからです。
- 管理が楽になる:後からURLの形を変えたいとき、設定ファイルを1箇所直すだけでサイト全体のURLルールを変更できます。
プログラミング未経験の方にとって、最初はコードを書くこと自体が壁に感じるかもしれません。しかし、このルーティングの仕組みを理解すると、Webサイトがどのようにして動いているのか、その「裏側」が手に取るようにわかるようになります。CodeIgniterは、こうした難しい仕組みをとてもシンプルに提供してくれる素晴らしい道具なのです。
8. エラーを防ぐためのポイント
ルートパラメータを使う際に初心者が陥りやすいミスがあります。それは「順番」と「数」の不一致です。設定ファイルで (:num) を1つ書いたなら、コントローラーの関数でも必ず1つの変数で受け取らなければなりません。このバランスが崩れると、プログラムは「話が違うよ!」と怒ってエラーを出してしまいます。
もしエラー画面が出てしまったら、まずは「渡す側の数」と「受け取る側の数」が合っているかを確認してください。落ち着いて確認すれば、必ず解決できます。プログラミングは失敗を繰り返して上達するものです。まずは小さなコードから試して、URLが変わる楽しさを体験してみてください。