今回はCodeigniter4のバリデーション機能を使って、入力チェックを実装していきます。
バリデーションには種類がたくさんありますが、この記事では初心者でも使いやすい基本的なものに絞って解説していきます。
ほかにも気になるバリデーションがあれば、公式ドキュメントの一覧が参考になります。
https://ci-trans-jp.gitlab.io/user_guide_4_jp/libraries/validation.html
実装する流れ
- バリデーションのルールを設定する変数を定義する
- バリデーションしたいinputの属性に合わせてエラーの種類やメッセージを定義する
- Codeigniterのバリデーションオブジェクトを取得する
- バリデーションルールを反映させる
- バリデーションを実行
- エラーの場合は元の画面に戻す

コントローラの修正
saveメソッド内にバリデーション処理を追加します。
CodeIgniter4 では、service('validation') を使うことで バリデーションオブジェクト を簡単に取得できます。
/**
* 登録・更新
*/
public function save()
{
//postされた値を取得
$formObj = $this->request->getPost();
//↓バリデーション処理追加
$validateRules = [
//ユーザ名:必須、50文字以下
'user_nm' => [//inputタグのname属性の値を指定する
'rules' => 'required|max_length[50]',
'errors' => [
'required' => 'ユーザ名は必須です。',
'max_length' => 'ユーザ名は50文字以内で入力してください。',
],
],
//年齢:数字、3桁以下
'age' => [
'rules' => 'permit_empty|integer|max_length[3]',
'errors' => [
'integer' => '年齢は数字で入力してください。',
'max_length' => '年齢は3桁以内で入力してください。',
],
]
];
$validation = service('validation');//codeigniterのバリデーションオブジェクトを使用する
$validation->setRules($validateRules);
if(!$validation->run($formObj)){
//エラー情報取得
$errors = $validation->getErrors();
// 再表示へ(値とエラーを渡す)
return view('save', [
'errors' => $errors,
'formObj' => $formObj
]);
}
//↑バリデーション処理追加
try {
//トランザクション開始
$this->db->transBegin();
//~~~~~~~省略~~~~~~~
}$validateRulesについて
バリデーションを行うための定義をこの変数にしていきます。
型は連想配列とし、1次元目にinputタグのname属性の値を設定します。さらにその中にバリデーションの種類やエラーメッセージを定義します。
ユーザ名の場合、必須かつ文字数が50文字以下なので
required|max_length[50]
とします。区切り文字は「|」です。
エラーメッセージについては一旦直で書いて後から別ファイルにまとめる形とします。
そして$validation->setRules($validateRules)でバリデーションの定義を設定し、続けて
$validation->run($formObj)でバリデーションを実行します。
戻り値はTURE・FALSEのためif文の中に直接書いてエラーがあるかをチェックしています。
エラーがある場合は、エラーの内容を取得し、もとの画面に戻すといった流れになります。
ビューの修正
続いて、ビューでバリデーションエラーを表示できるようにします。
今回の記事では、
「エラーメッセージを画面の上部にまとめて表示するパターン」
で進めています。
初心者は特に、入力欄ごとにエラーを散らすより、まとめて出す方が管理しやすくておすすめです。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome to CodeIgniter 4!</title>
<meta name="description" content="The small framework with powerful features">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/png" href="/favicon.ico">
</head>
<body>
<h1>新規登録・更新</h1>
<?php if (!empty($errors)): ?>
<div class="alert alert-danger">
<ul>
<?php foreach ($errors as $error): ?>
<li><?= esc($error) ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<form action="/test/save" method="POST">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= $formObj["id"] ?>">
<div>
ユーザ名<input type="text" name="user_nm" value="<?= $formObj["user_nm"] ?>">
</div>
<br>
<div>
年齢<input type="text" name="age" value="<?= $formObj["age"] ?>">
</div>
<input type="submit" value="更新">
</form>
<?php if($formObj["id"] != ''): ?>
<form action="/test/delete" method="POST">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= $formObj["id"] ?>">
<input type="submit" value="削除">
</form>
<?php endif; ?>
</body>
</html>
$errorsがある場合にループしてすべてのメッセージを出すといった実装になります。

まとめ
今回の記事では、CodeIgniter4 のバリデーションを使って
「入力チェック → メッセージ表示」 の流れを実装してみました。
Codeigniterのバリデーションってこうやって書くんですね。実行自体の実装はしたことがありましたが、ルールの定義の仕方はカスタマイズが多く標準のやり方を知らなかったので勉強になりました。
やはり、すでにあるものと0-1で作るのはわけが違いますね。
今回の記事でもお分かりの通り中身は初心者向けに実装しているので、次はより実務に沿った内容でバリデーションの処理や定義の仕方、メッセージは別ファイルに持たせるなどをまとめていけたらと思います!
