CodeIgniterのルーティング詳細設計を徹底解説!初心者でも迷わないURL設定の基本
生徒
「CodeIgniterでWebサイトを作っているのですが、URLがどうやってページに繋がるのか仕組みが分かりません。」
先生
「それは『ルーティング』という仕組みが担当しています。住所を見て手紙を届ける配達員さんのような役割ですね。」
生徒
「詳細設計とか基本ルーティングとか、難しそうな言葉があって混乱しています……。」
先生
「大丈夫ですよ。まずはルーティングが何をしているのか、基礎から一歩ずつ紐解いていきましょう!」
1. ルーティングとは何か?を世界一わかりやすく解説
プログラミングの世界、特にCodeIgniter(コードイグナイター)のようなフレームワークにおいて、ルーティングとは「やってきたURLに対して、どのプログラムを動かすかを決める交通整理」のことです。
例えば、あなたがインターネットで「https://example.com/contact」というURLをクリックしたとします。このとき、サーバーの中では「『contact』という文字が来たから、お問い合わせ画面を作るプログラムを動かそう!」という判断が行われます。この「URL」と「動かすプログラム」を紐付ける作業こそがルーティングなのです。
パソコンを触ったことがない方でも、「電話の短縮ダイヤル」をイメージすれば簡単です。「1番を押したらお父さんに繋がる」「2番を押したらお母さんに繋がる」という設定と同じように、「このURLならこの処理」というルールをあらかじめ決めておくのがルーティングの役割です。
2. CodeIgniterの「基本ルーティング」の仕組み
CodeIgniterには、最初から備わっている基本ルーティング(オートルーティング)という便利な機能があります。これは、特別な設定をしなくても、URLの書き方によって自動的に動くプログラムが決まるルールです。
基本的には以下のルールでURLが解釈されます。
example.com/クラス名/メソッド名
ここで出てくる「クラス」とは、プログラムをまとめた大きな箱(コントローラー)のこと。「メソッド」とは、その箱の中にある具体的な命令(関数)のことです。例えば、「ショップ」という箱の中に「商品一覧を表示する」という命令があるイメージですね。
初心者の方は、まずこの自動的なルールがあることを覚えておきましょう。しかし、これだけでは「もっと短いURLにしたい」「日本語のような分かりやすいURLにしたい」という要望に応えられません。そこで必要になるのが「詳細設計」です。
3. ルーティングの「詳細設計」が必要な理由
ルーティングの詳細設計とは、先ほどの自動ルールを使わずに、自分たちで「このURLのときは、このプログラムを動かす!」と一つずつ手動でカスタマイズして決めることです。
なぜ面倒な手動設定が必要なのでしょうか?主な理由は以下の通りです。
- SEO対策(検索エンジン最適化):Googleなどの検索結果で上位に表示されやすくするため、意味のあるURL(例:/items/apple)にしたい。
- セキュリティ:内部のプログラム構造(クラス名など)をURLから推測されないように隠したい。
- 使いやすさ:ユーザーが覚えやすい、短くてシンプルなURLを提供したい。
詳細設計を行うことで、プログラムの作り(内部構造)と、ユーザーに見えるURL(外部の見た目)を切り離すことができるようになります。これはプロのWeb開発において非常に重要な考え方です。
4. 実際にルーティングを書いてみよう(基本編)
CodeIgniterでは app/Config/Routes.php というファイルに設定を書き込みます。まずは、シンプルな書き換えの例を見てみましょう。ここでは「news」というURLが来たら、「Articles」というクラスの「index」という命令を動かす設定にします。
// 「news」というURLにアクセスしたら、Articlesクラスのindexメソッドを呼び出す
$routes->get('news', 'Articles::index');
このコードを書くことで、ユーザーがブラウザに example.com/news と入力しただけで、内部では Articles というプログラムが一生懸命動いてニュース記事を表示してくれるようになります。これがルーティング設定の第一歩です。
5. プレースホルダを使った応用的なルーティング
次に、URLの一部が数字や名前によって変わる場合の書き方を学びましょう。例えば、商品IDが「1」のページもあれば「100」のページもありますよね。これらを一つずつ設定するのは大変です。そこでプレースホルダという「身代わり」の記号を使います。
もっともよく使われるのが、数字を表す (:num) です。
// 「product/数字」というURLが来たら、Shopクラスのshowメソッドにその数字を渡す
// 例:product/15 -> Shop::show(15)
$routes->get('product/(:num)', 'Shop::show/$1');
この $1 というのは、(:num) の部分に入ってきた数字をそのまま後ろのプログラムにパスするという意味です。これにより、数万件の商品があっても、たった一行の設定で全てのURLをカバーできるようになります。
6. 文字列を扱うルーティング設定
数字だけでなく、アルファベットやキーワードをURLに含めたい場合もあります。そのときは (:any) というプレースホルダを使います。これは「どんな文字でもOK」という意味です。
例えば、ユーザー名ごとにプロフィールページを表示したい場合の設定は以下のようになります。
// 「user/名前」というURLが来たら、Profileクラスのviewメソッドを呼び出す
// 例:user/tanaka -> Profile::view('tanaka')
$routes->get('user/(:any)', 'Profile::view/$1');
このように設定することで、example.com/user/tanaka や example.com/user/sato といったURLが自由に作れるようになります。とても柔軟で便利ですよね。
7. 複数の条件を組み合わせる複雑な設計
さらに高度な設計では、複数の情報をURLに含めることがあります。例えば、「カテゴリ」と「記事ID」を両方URLに入れたい場合です。詳細設計を行えば、このような複雑な構造も自由自在です。
// 「blog/カテゴリ名/記事番号」という形式
// 例:blog/tech/256 -> BlogController::entry('tech', 256)
$routes->get('blog/(:any)/(:num)', 'BlogController::entry/$1/$2');
ここで使われている $1 は1番目の (:any) を指し、$2 は2番目の (:num) を指しています。このように、URLから情報を取り出してプログラムに渡すことで、動的なWebサイトが構築されていきます。これをマスターすれば、あなたのWebサイトのURL設計はプロ級になります。
8. ルーティング詳細設計で注意すべきポイント
自由度が高いルーティングですが、設計する際に気をつけるべき「落とし穴」がいくつかあります。プログラミング初心者の方が特に意識したいのは「優先順位」です。
ルーティングの設定は、上から順番にチェックされます。もし一番上に「なんでも受け付ける」設定を書いてしまうと、その下に書いた特定のルールが無視されてしまうことがあります。そのため、詳細なルール(具体的なURL)を上に書き、大まかなルール(汎用的なURL)を下に書くのが鉄則です。
また、URLは一度決めて公開すると、後から変更するのが大変です。他のサイトからリンクを貼られたり、Googleに登録されたりした後にURLを変えると、「ページが見つかりません」というエラーが出てしまうからです。だからこそ、開発の初期段階で「どんなURLにするか」をじっくり考える詳細設計が極めて重要なのです。
9. HTTPメソッド(GETとPOST)の使い分け
ルーティングの設定でよく見かける $routes->get という記述。この get は「HTTPメソッド」と呼ばれるものの一つです。インターネットの通信にはいくつかの種類があり、用途によって使い分ける必要があります。
- GET(ゲット):ページを表示したり、情報を取得したりするときに使います。URLを直接入力してアクセスするのはこれです。
- POST(ポスト):お問い合わせフォームの送信や、パスワードの変更など、サーバーにデータを送るときに使います。
もし、お問い合わせフォームの送信処理をルーティングする場合、以下のように post を使って書くのが一般的です。
// お問い合わせフォームの送信ボタンを押した時の処理
$routes->post('contact/send', 'Contact::submit');
このように、単に「どのURLか」だけでなく「どんなアクション(取得か送信か)」まで詳細に設計するのが、CodeIgniterの正しいルーティングの姿です。