CodeIgniter 4のモデルでバリデーションを組み込む方法!DB操作を安全にする初心者ガイド
生徒
「CodeIgniterで、ユーザーが入力したデータがおかしくないかチェックする方法はありますか?」
先生
「それは『バリデーション』という機能ですね。モデルの中に設定を書いておくだけで、自動でチェックしてくれる便利な仕組みがありますよ。」
生徒
「わざわざif文をたくさん書かなくてもいいんですか?設定の仕方を教えてください!」
先生
「もちろんです!CodeIgniterのモデルを使えば、とてもスマートに実装できます。基本から一緒に見ていきましょう。」
1. バリデーション(入力チェック)とは何か?
プログラミングの世界でよく使われるバリデーション(Validation)とは、日本語で「検証」や「確認」という意味です。ウェブサイトの申し込みフォームなどを想像してみてください。メールアドレスの欄に名前が書いてあったり、電話番号の欄に漢字が入力されていたら困りますよね。
このように、システムが受け取るデータが「正しい形式で作られているか」「空っぽではないか」を、データベースに保存する前に厳しくチェックする作業をバリデーションと呼びます。これは、お城の門番のような役割を果たします。不適切なデータという「不審者」を門の前で追い返し、きれいなデータだけをデータベースという「宝物庫」に入れるためです。PHPのフレームワークであるCodeIgniter 4では、この門番の役割をモデル(Model)という場所に任せることができます。
2. なぜモデルでバリデーションを行うのか?
CodeIgniterでは、コントローラーという場所でもチェックはできます。しかし、モデルにバリデーションを書き込む最大のメリットは、プログラムの再利用性と安全性が高まることです。モデルはデータベースとの橋渡し役です。データの保存や更新を行う「窓口」に直接ルールを書いておくことで、どの画面からデータが送られてきても、必ず同じルールでチェックが行われるようになります。
例えば、「ユーザー名は10文字以内」というルールをモデルに書いておけば、会員登録画面でも、プロフィール編集画面でも、常にそのルールが適用されます。これにより、プログラムの書き漏らしによるミスを防ぎ、初心者でも一貫性のある頑丈なシステムを作ることができるのです。これを「ビジネスロジックの集約」と呼んだりもします。
3. モデルにバリデーションルールを設定する基本手順
それでは、具体的にモデルにルールを書いてみましょう。CodeIgniterのモデルクラスには、あらかじめ $validationRules という変数が用意されています。ここに配列という形式でルールを箇条書きにしていきます。まずは、非常にシンプルな会員登録用のモデルを例に見てみましょう。
namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model
{
// 操作するテーブルの名前
protected $table = 'users';
// 書き込みを許可する項目のリスト
protected $allowedFields = ['username', 'email', 'age'];
// ここにバリデーションルールを書く!
protected $validationRules = [
'username' => 'required|min_length[3]|max_length[20]',
'email' => 'required|valid_email|is_unique[users.email]',
'age' => 'required|numeric'
];
}
上記のコードでは、required(必須入力)や min_length(最低文字数)といった言葉を使っています。これらはCodeIgniterが最初から持っている魔法の合言葉で、これだけで複雑なチェックを自動的に実行してくれます。
4. よく使われる便利なルールの種類と書き方
初心者の方がまず覚えるべき、よく使うルールをいくつか紹介します。これらを組み合わせることで、ほとんどのフォームに対応できます。
- required:必須項目です。空っぽだとエラーになります。
- min_length[数字]:最低でもこの文字数は入力してね、という指示です。
- max_length[数字]:これ以上の文字数はダメだよ、という制限です。
- valid_email:ちゃんとしたメールアドレスの形式(@があるか等)になっているか調べます。
- numeric:数字だけが入力されているかチェックします。
- is_unique[テーブル名.カラム名]:データベースを調べて、すでに誰かが使っているデータ(重複)がないか確認します。
これらを「|」(バーティカルバー)で繋ぐことで、「必須であり、かつメールの形式でなければならない」といった複数の条件を一度に指定できるのが、CodeIgniterの素晴らしいところです。
5. エラーメッセージを日本語で分かりやすくカスタマイズ
デフォルトの状態では、エラーが起きたときに英語でメッセージが表示されてしまいます。日本のユーザー向けに親切なサイトを作るには、日本語のメッセージを表示させたいですよね。モデルの $validationMessages という変数を使うと、項目ごとに好きな文章を設定できます。
protected $validationMessages = [
'username' => [
'required' => 'お名前は必ず入力してくださいね。',
'min_length' => 'お名前は3文字以上で入力をお願いします。'
],
'email' => [
'valid_email' => '正しいメールアドレスの形になっていないようです。',
'is_unique' => 'そのメールアドレスは既に登録されています。'
]
];
このように設定することで、エラーが起きたときに「お名前は必ず入力してくださいね」という優しい日本語をユーザーに届けることができます。こうした細かな配慮が、使いやすいシステムを作る第一歩になります。
6. コントローラーからモデルを呼び出して保存する流れ
準備ができたら、実際にコントローラーからモデルを使ってデータを保存してみましょう。実は、モデルにルールを書いておけば、保存ボタン(save() や insert())を押した瞬間に、自動的にバリデーションが走り出します。私たちは、その結果が成功か失敗かを判定するだけでOKです。
public function create()
{
$userModel = new \App\Models\UserModel();
// 画面から送られてきたデータ
$data = [
'username' => 'たろう',
'email' => 'test@example.com',
'age' => 25
];
// 保存を試みる!この時、自動でバリデーションが走る
if ($userModel->save($data) === false) {
// 失敗した場合、エラー内容を取得して表示する
$errors = $userModel->errors();
print_r($errors);
} else {
echo "無事に保存できました!";
}
}
$userModel->save($data) という一行だけで、裏側では「名前は短くないか?」「メールは重複していないか?」といった厳しいチェックが行われています。もしルールに違反していれば false(失敗)が返ってくるので、プログラムはその後の処理を安全に止めることができるのです。
7. 条件によってルールを変えたい時のテクニック
時には、「新規登録のときはパスワードが必須だけど、プロフィール編集のときはパスワードを空欄でも良い(変更しない)」というケースがあります。CodeIgniterでは、withGroup() という方法を使ったり、その場でルールを上書きしたりすることも可能です。
// 特定の場面だけルールを一時的に変更する例
$userModel = new \App\Models\UserModel();
// ageのルールを一時的に「必須ではない」に変える
$userModel->setValidationRule('age', 'permit_empty|numeric');
$userModel->save($data);
permit_empty は「空っぽでもOK」という意味のルールです。このように、基本のルールはモデルにしっかり書いておきつつ、状況に合わせて柔軟に調整できるのも、CodeIgniterが初心者からプロまで愛される理由の一つです。
8. データベースを守る!「許可された項目」の重要性
バリデーションとセットで大切なのが、最初に少し出てきた $allowedFields です。これは「この項目だけはデータベースに書き込んでいいよ」という許可リストです。もし悪意のある人が、システムが想定していない項目(例えば管理者権限フラグなど)を勝手に送りつけてきても、このリストに載っていなければ無視されます。バリデーションで「中身の正しさ」を確認し、許可リストで「項目の正しさ」を確認する。この二段構えが、安全なウェブサイトを作る鉄則です。
パソコンを触り始めたばかりの方にとって、こうした設定は少し面倒に感じるかもしれません。しかし、一つ一つの設定が、あなたの作ったプログラムをサイバー攻撃や予期せぬエラーから守る盾になります。まずは簡単なルールから始めて、少しずつ複雑なチェックに挑戦していきましょう!