CodeIgniter 4でRESTful API開発!初心者でも簡単バリデーション実装ガイド
生徒
「CodeIgniterでAPIを作っているのですが、送られてきたデータが正しいかチェックする方法はありますか?」
先生
「CodeIgniterには『バリデーション』という、データの不備を自動でチェックしてくれるとても便利な仕組みが備わっていますよ。」
生徒
「バリデーション…難しそうな言葉ですね。パソコン初心者でも設定できますか?」
先生
「大丈夫です!ルールを決めるだけで、プログラムが代わりに『名前が空っぽだよ!』とか『数字じゃないよ!』と教えてくれるようになります。一緒に作り方を見ていきましょう。」
1. APIバリデーションとは?初心者向けに基礎解説
プログラミングの世界でよく聞くバリデーション(Validation)とは、一言でいうと「入力チェック」のことです。例えば、あなたがスマートフォンのアプリで会員登録をするとき、メールアドレスの欄に名前を書いてしまったら「正しい形式で入力してください」と怒られたことはありませんか?それがバリデーションの役割です。
特にRESTful API(レストフル エーピーアイ)を開発する場合、画面が見えない状態でデータのやり取りが行われるため、送られてきたデータが「期待通りか」を確認することは非常に重要です。APIとは、アプリケーション同士が会話するための窓口のようなもの。窓口に変な書類が届かないよう、入り口でしっかり検品するのがバリデーションなのです。
2. CodeIgniter 4でバリデーションを使う準備
PHPのフレームワークであるCodeIgniter 4(コードイグナイター4)では、この検品作業を簡単に行うための専用の道具(ライブラリ)が最初から用意されています。自分で「文字の長さを数えて、もし1文字もなかったらエラーを表示して…」という面倒なプログラムをゼロから書く必要はありません。
まずは、コントローラーという「司令塔」の役割を持つファイルの中で、バリデーション機能を呼び出すところからスタートします。CodeIgniterでは $this->validate() という命令ひとつで、複雑なチェックを開始することができるのです。
3. 実際にバリデーションを書いてみよう(基本編)
まずは、ユーザー名とメールアドレスを受け取るシンプルなAPIを想定してコードを書いてみましょう。ここでは「ユーザー名は必須(必ず入力する)」「メールアドレスは正しい形式であること」というルールを設定します。
public function create()
{
// 1. チェックするルールを決める
$rules = [
'username' => 'required|min_length[3]',
'email' => 'required|valid_email',
];
// 2. ルールに従ってチェックを実行
if (!$this->validate($rules)) {
// 3. 失敗した場合はエラー内容を返す
return $this->fail($this->validator->getErrors());
}
// チェック合格!保存処理などを行う
return $this->respondCreated(['message' => '登録に成功しました!']);
}
上記のコードにある required は「必須」、min_length[3] は「3文字以上」、valid_email は「メールアドレスの形式か」という意味です。これらを縦棒(|)でつなぐだけで、複数のルールを同時に適用できるのがCodeIgniterのすごいところです。
4. バリデーションエラーの実行結果を確認する
もし、ルールに違反したデータが送られてきた場合、プログラムはどのように反応するでしょうか。例えば、メールアドレスを空のまま送信したときの実行結果を見てみましょう。
{
"username": "The username field is required.",
"email": "The email field is required."
}
このように、どこが間違っているのかを教えてくれるメッセージが自動で生成されます。これをAPIの利用者に返すことで、「あ、メールアドレスを入れ忘れたな」と気づいてもらうことができるのです。英語で表示されますが、日本語にカスタマイズすることも可能です。
5. 数値チェックと範囲指定のテクニック
次に、数字を扱う場合のバリデーションを見てみましょう。例えば、商品の注文APIを作る際、「注文個数は必ず1個以上、100個以下」というルールを作りたい場合があります。この場合、integer(整数であること)や greater_than_equal_to(〇〇以上)といった命令を使います。
public function order()
{
$rules = [
'item_id' => 'required|numeric',
'quantity' => 'required|integer|greater_than_equal_to[1]|less_than_equal_to[100]'
];
if (!$this->validate($rules)) {
return $this->fail($this->validator->getErrors());
}
return $this->respond(['status' => '注文を受け付けました']);
}
このように、数値の範囲を限定することで、マイナスの注文が届いたり、ありえない大量注文が入ったりすることを防ぐことができます。プログラミングにおいて、ユーザーが悪意を持って変な値を送ってくることはよくあるため、こうした「ガード」を固めることがセキュリティ対策にもつながります。
6. カスタムメッセージで日本語化する方法
標準のエラーメッセージは英語ですが、日本向けのサービスなら日本語でエラーを表示したいですよね。CodeIgniterでは、ルールごとに表示する言葉を自分で決めることができます。これをカスタムエラーメッセージと呼びます。
public function register()
{
$rules = [
'nickname' => 'required',
];
$messages = [
'nickname' => [
'required' => 'ニックネームは必ず入力してくださいね!',
],
];
if (!$this->validate($rules, $messages)) {
return $this->fail($this->validator->getErrors());
}
return $this->respond(['message' => '完了']);
}
第2引数に $messages という配列を渡すだけで、エラー時の言葉を自由に変えることができます。初心者の方でも、これなら親切なアプリが作れそうですよね。ユーザーにとって分かりやすい言葉を選ぶのも、エンジニアの大切な仕事の一つです。
7. 複数のデータを一気にチェックする「配列」の対応
少し応用的な内容ですが、APIでは「複数の商品のIDを一度に送る」といったように、データがまとまって届くことがあります。CodeIgniter 4のバリデーションは、こうした「配列データ」に対しても非常に強力な力を発揮します。アスタリスク(*)を使うことで、リストの中身すべてを一度にチェックできるのです。
public function bulkUpdate()
{
// tagsというリストの中身すべてが「3文字以上」かチェックする
$rules = [
'tags.*' => 'required|min_length[3]'
];
if (!$this->validate($rules)) {
return $this->fail($this->validator->getErrors());
}
return $this->respond(['message' => '一括更新に成功しました']);
}
例えば、ブログのタグを5個送ったとき、その5個すべてが正しく入力されているかを一行のルールで確認できます。これを自分でループさせてチェックするのは大変ですが、フレームワークを使えばたったこれだけで済んでしまいます。
8. 条件付きバリデーションの活用
「もし、ある項目が入力されていたら、こっちの項目も必須にする」という高度なチェックが必要になることもあります。CodeIgniterには required_with という便利なルールがあり、特定のデータが存在するときだけチェックを厳しくするといった制御が可能です。
例えば、「配送方法で『宅配便』を選んだ場合のみ、電話番号を必須にする」といった現実世界のルールをそのままプログラムに落とし込めます。こうした細かい配慮が、使い勝手の良いシステムを生み出すコツになります。
9. バリデーションルールを整理して管理する
プログラムが大きくなってくると、コントローラーの中にルールをたくさん書くのは、部屋が散らかっているのと同じで見栄えが悪くなります。CodeIgniterでは app/Config/Validation.php という設定ファイルに、あらかじめルールを「セット」として登録しておくことができます。
そうすることで、コントローラー側では「会員登録用のルールセットを使って!」と名前を指定するだけで呼び出せるようになります。料理で例えるなら、毎回調味料を測るのではなく、あらかじめ作っておいた「合わせ調味料」を使うような感覚です。これでコードがスッキリして、後から修正するのも楽になります。
10. API開発におけるバリデーションの重要性
最後に、なぜここまでバリデーションにこだわるのかを理解しておきましょう。Webサイトの画面から入力する場合、JavaScriptという技術を使って送信ボタンを押す前にチェックすることが多いです。しかし、APIは画面を通さず、直接データを送りつけることができます。
もしサーバー側(CodeIgniter側)でチェックをサボってしまうと、データベースに変なデータが混ざったり、システムが動かなくなったりする危険があります。バリデーションは、あなたのシステムを守る「最後の砦(とりで)」なのです。最初は難しく感じるかもしれませんが、基本的な required や numeric から少しずつ覚えていけば大丈夫です。