Codeigniter4でバリデーションを実装していると、エラーメッセージの扱いに悩むことはありませんか?
- 後から文言を修正するのが大変
- 画面ごとに表記がバラバラになる可能性がある
- コントローラに直書きだと面倒くさい
- そもそも、どこに定義するのかわからない
最近Codeigniterを触り始めた方や初心者さんは上記のような悩みが出ると思います。
エラーメッセージを共通ファイルに定義することでその悩みは解決できます!
- エラーメッセージを共通化することで、メンテナンス性が向上する
- バリデーションを実装する際のコード量が減り、作業が楽になる
- 設計書も「共通定義」として整理できる
- チーム開発でも「このファイルを見てください」と伝えるだけだ済む
- テストケースが減る
実際にこの記事を書きながら作成している超簡易的なアプリでこの方法を使ってバリデーションを実装しました。
さらに、今回紹介する内容は実務でもよく使われている方法なのでぜひ参考にしてください。
実装
実装する流れ
- app/Langageの中に「ja」ディレクトリを作成する
- 上記で作成した「ja」ディレクトリの中に「Validation.php」ファイルを作成する
- 「Validation.php」にメッセージを定義する
- app/Config/App.phpのdefaultLocaleを編集する
- コントローラでバリデーションを使用する
jaディレクトリ、Validation.phpファイルの作成

「ja」ディレクトリを作成し、その中にValidation.phpを作成します。
このファイルはCodeIgniter4が持つ言語ファイルの仕組みを利用してバリデーションメッセージを上書きするためのもので、エラーメッセージを日本語化できます。
<?php
return [
'required' => '{field} は必須項目です。',
'integer' => '{field} は数字で入力してください。',
'max_length' => '{field} は {param} 文字以内で入力してください。',
];前回までで使用したバリデーションルールは「必須」、「数字」、「文字数」のチェックのため上記のように連想配列をreturnするように定義します。
見て想像つくと思いますが、「{field}、{param}」の個所は置き換え文字となり、この部分をコントローラ側で制御するイメージです。
App.phpの修正

App.phpの「$defaultLocale」を「en」から「ja」に修正してください。
もともとは「en」となっており、「ja」にしないと今回作成した「ja」ディレクトリのValidation.phpを参照しに行ってくれません。
コントローラの修正
//~~~~~省略~~~~~~
/**
* 登録・更新
*/
public function save()
{
//postされた値を取得
$formObj = $this->request->getPost();
//バリデーション
$validateRules = [
//ユーザ名:必須、50文字以下
'user_nm' => ['label' => 'ユーザ名', 'rules' => 'required|max_length[50]'],
//年齢:数字、3桁以下
'age' => ['label' => '年齢', 'rules' => 'permit_empty|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,
]);
}
//~~~~~省略~~~~~以前は$validateRulesでメッセージの定義をしていましたが共通化したのでパパっと修正していきます。
まず、Validate.phpの「{field}」の部分は’label’ => XXXとして定義し、ここが置き換わり文字となります。
「{param}」はバリデーションに文字数などの引数を設定することでそれがparamとして置き換わります。

ビュー
ビュー側に特に変更はありません。エラーの内容をまとめて表示しております。
<?php //~~~~~省略~~~~~ ?>
<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; ?>
<?php //~~~~~省略~~~~~ ?>まとめ
各バリデーションに対してメッセージを増やしたい場合は、このValidation.phpに追記していくことでどんどん使えるようになります。メンテナンス性も向上し、チーム開発がスムーズになり、なんといってもテストケースが減ってリスクも減る。これが共通化のメリットですから共通化できるところはしていきたいですね。
前回までの紹介した内容は以下になりますのでぜひご参照ください!
【Codeigniter4】バリデーション実装(初心者向け)
また、最近のCSVの仕事の案件で、はまってしまったことがあり以下の記事にCSVで気を付けるべきことをまとめました。
CSV出力で確認すべき7項目!
次はajaxを使用したバリデーションを実装しようと思います。
