CodeIgniter 4でRESTful API開発!初心者向けルーティング設計のベストプラクティス
生徒
「CodeIgniterを使って、外部のアプリとデータをやり取りする『API』というものを作りたいのですが、URLの決め方にルールはありますか?」
先生
「はい、あります。API開発では『ルーティング』という設定で、どのURLにアクセスしたらどの処理を動かすかを決めますが、それには世界共通の『REST(レスト)』という考え方を取り入れるのが一般的です。」
生徒
「難しそうですね…。初心者でもきれいに設計できるコツを教えてください!」
先生
「CodeIgniter 4にはAPI専用の便利な機能が備わっています。まずは基本から一緒に学んでいきましょう!」
1. APIとルーティングの基本を知ろう
まず、API(エーピーアイ)とは「Application Programming Interface」の略で、自分たちのプログラムを他のプログラムから使えるようにするための「窓口」のようなものです。例えば、スマホアプリがサーバーにある最新の情報を取得するとき、このAPIという窓口を叩いてデータをやり取りします。
そして、その窓口の場所を整理整頓するのがルーティングです。ルーティングとは、ユーザー(またはアプリ)が「この住所(URL)に来たら、このプログラム(コントローラー)を動かすよ」という道案内のような設定を指します。CodeIgniter 4では、app/Config/Routes.phpというファイルにこの道案内を書き込んでいきます。
初心者が最初に覚えるべきことは、APIのURLは「何をするための窓口か」が誰が見ても一目でわかるように名付けることです。これを無視して適当な名前にしてしまうと、後で自分でも何がどこにあるか分からなくなってしまうからです。整理整頓された設計は、バグの少ない良いプログラムへの第一歩です。
2. RESTfulなURL設計とは?
API開発で最も推奨される設計手法がREST(レスト)です。RESTに基づいた設計を「RESTful(レストフル)」と呼びます。これは、URLを「名詞」で表し、動作を「HTTPメソッド」という通信の種類で使い分ける考え方です。
例えば、本(Book)を管理するAPIを作る場合、以下のようにURLを設計します。
- 本の一覧を見る:
GET /books - 本を1冊新しく登録する:
POST /books - 特定の1冊の詳細を見る:
GET /books/1 - 特定の1冊を書き換える:
PUT /books/1 - 特定の1冊を消去する:
DELETE /books/1
このように、「何に対して(名詞)」をURLで表し、「何をするか」は通信の形式(GETやPOSTなど)で使い分けるのがベストプラクティス、つまり「最も効率的で良いとされるやり方」です。CodeIgniter 4では、これらを一つずつ書かなくても、一行でまとめて設定できる魔法の命令があります。
3. 実際にルーティングを書いてみよう(基本編)
それでは、CodeIgniter 4で最も基本的なルーティングの書き方を見てみましょう。まずは「商品(Products)」の一覧を取得するシンプルなルートを設定してみます。パソコンを触ったことがない方でも、この一文を書くだけで道案内が完成します。
// app/Config/Routes.php の中に記述します
// 'products' というURLにアクセスが来たら、ProductControllerのindexメソッドを動かします
$routes->get('products', 'ProductController::index');
このコードの意味を解説します。$routes->getというのは「GET(ゲット)」という方法でアクセスされた時、という意味です。GETは主に「データを読み取るとき」に使われます。最初の 'products' はURLの名前で、後半の 'ProductController::index' は、実際に動かすプログラムの名前です。このように「いつ、どこに、何を」を指定するのが基本となります。
4. 複数の処理をまとめて設定する「resource」
先ほどのRESTfulな設計(取得、登録、更新、削除)を一つずつ書くと、ファイルが非常に長くなってしまいます。CodeIgniter 4では resource という便利な機能を使えば、一気に5つ以上の設定を自動で完了させてくれます。これがAPI開発におけるルーティング設計の王道です。
// これだけで GET, POST, PUT, DELETE のすべての基本設定が完了します!
// 非常に強力で、設計を綺麗に保つための秘訣です
$routes->resource('articles');
この一行を書くだけで、記事(Articles)の「一覧表示」「詳細表示」「作成」「修正」「削除」の5つのURLが自動的に生成されます。初心者が個別にルーティングを書くと、つい /articles/delete/1 のようなURLを作りたくなりますが、resourceを使うことで、DELETE /articles/1 という「正しい」設計に強制されるため、初心者ほど積極的に使うべき機能です。
5. バージョン管理を取り入れた設計
API開発で忘れてはならないのがバージョン管理です。サービスを長く続けていると、古いアプリを使っている人のために以前の仕組みを残しつつ、新しい仕組みを作りたい時が来ます。そのためにURLに v1 や v2 といった数字を含めるのが一般的です。
CodeIgniterでは「グループ化」という機能を使って、これをスマートに表現できます。以下のコードを見てみましょう。
// APIのバージョン1 (v1) グループとしてまとめる
$routes->group('api/v1', function($routes) {
// この中にあるルーティングはすべて頭に 'api/v1/' がつきます
// 例:GET /api/v1/users
$routes->resource('users');
$routes->get('health-check', 'Status::check');
});
このようにグループ化することで、URLが example.com/api/v1/users のようになり、非常に整理された印象になります。後から v2 を作りたくなったら、新しくグループを追加するだけで済みます。将来の拡張性を考えるなら、最初からこの形式で設計しておくのがベストです。
6. 特定の項目だけを公開する「only」と「except」
resource を使うとすべての機能が有効になりますが、「読み取り専用のAPIにしたい」という場合もあります。例えば、ニュースサイトの記事一覧は誰でも見られますが、削除や更新はAPI経由でさせたくない時です。その場合は only という設定を使います。
// 'index'(一覧)と 'show'(詳細)だけを公開する場合の設定
$routes->resource('news', ['only' => ['index', 'show']]);
逆に、「削除(delete)以外は全部OK」としたい場合は except を使います。このように機能を制限することで、予期せぬアクセスから大切なデータを守ることができます。セキュリティの観点からも、必要な窓口だけを開けておく、という意識は非常に大切です。不必要な扉を閉じておくことが、安全なウェブアプリへの近道です。
7. パラメータの受け取り方とバリデーション
APIでは、特定のIDを指定してデータを取得することがよくあります。URLの中に含まれる /users/5 の「5」のような数字をプログラム側で受け取る仕組みです。CodeIgniterでは (:num) や (:any) といったプレースホルダ(仮置きの場所)を使います。
バリデーションとは、送られてきたデータが正しい形式かどうかをチェックすることです。例えば「年齢には数字しか入れないでね」というルールを決めておくことです。API開発では画面が見えない分、このチェックが非常に重要になります。不正なデータが入り込まないよう、ルーティングの段階から「ここは数字だけを受け付ける」と制限をかけるのが良い設計です。
8. CORS設定とセキュリティの考慮
最後に、API開発で初心者が必ずと言っていいほどぶつかる壁がCORS(コルス)です。これは「あるウェブサイトから別のドメインのAPIを呼び出すとき、安全のために制限をかける仕組み」のことです。例えば、example.comで動いているJavaScriptから、別の api.example.com にデータを送ろうとすると、エラーで拒否されることがあります。
これを許可するためには、サーバー側で「この相手からのアクセスならOKだよ」という許可証(ヘッダー情報)を出す必要があります。CodeIgniter 4では、ルーティングの設定だけでなく、「フィルター(Filters)」という機能を使って、一括でAPIのセキュリティを管理するのが一般的です。APIは世界中からアクセスされる可能性があるため、認証(パスワードのようなもの)やこのCORS設定をセットで考える習慣をつけましょう。