バリデーションの利用方法について調べる(ci4)

CodeIgniter

Codeigniter4 から入力フォームの検証(Validation)の使い方が大きく変わり、今まで設定ファイル(config/form_validation.php)で検証ルールを管理していたのに対し、モデルで管理できるようになりました。

ここでは、モデルに検証ルールを宣言する形でバリデーションを使う方法について調べた結果を記します。

データベースの構築

ここでは、以下のマイグレーションの設定でblogテーブルを構築します。

app/Database/Migrations/20190104000000_Add_blog.php
<?php

class Migration_Add_blog extends \CodeIgniter\Database\Migration {

  public function up()
  {
    $this->forge->addField(array(
      'id' => array(
        'type' => 'INT',
        'constraint' => 5,
        'unsigned' => TRUE,
        'auto_increment' => TRUE
      ),
      'title' => array(
        'type' => 'VARCHAR',
        'constraint' => '100',
      ),
      'description' => array(
        'type' => 'TEXT',
        'null' => TRUE,
      ),
      'created_at' => array(
        'type' => 'TIMESTAMP',
        'null' => TRUE,
      ),
      'updated_at' => array(
        'type' => 'TIMESTAMP',
        'null' => TRUE,
      ),
    ));
    $this->forge->addKey('id', TRUE);
    $this->forge->createTable('blog');
  }

  public function down()
  {
    $this->forge->dropTable('blog');
  }
}

マイグレーションの利用方法はこちらをご確認ください。

モデルの作成

モデルファイル名は、Blog_model.phpとします。

app/Models/Blog_model.php
<?php

namespace App\Models;

use CodeIgniter\Model;

class BlogModel extends Model
{
    protected $table      = 'blog';
    protected $primaryKey = 'id';
}

blogテーブルにアクセスする場合は上記で事足りますが、今回は更に検証ルールを追加します。

検証ルールの追加

app/Models/Blog_model.php
・・・省略
    protected $primaryKey = 'id';

    protected $allowedFields = ['title', 'description'];

    protected $validationRules = [
        'title'       => 'required|min_length[3]',
        'description' => 'required',
    ];
  
    protected $skipValidation     = false;
・・・省略
}

上記で追加した内容の内訳は以下の通りです。

$allowedFields更新を許可するカラムを指定
$validationRules検証ルール
$skipValidation保存時(saveメソッド)実行時にバリデーションを省略するフラグ

カスタムエラーメッセージの追加

Codeigniterのデフォルトのエラーメッセージを使いたくない場合は以下の変数をモデルに追加します。

app/Models/Blog_model.php
・・・省略
    protected $validationMessages = [
        'title' => [
            'required' => 'タイトルを入力してください。',
            'min_length' => '3文字以上で入力してください。',
        ],
        'description' => [
            'required' => '内容を入力してください。',
        ],
    ];
・・・省略
}

コントローラーの作成

ここでは、Blog.phpのファイル名にてコントローラーを以下の通りに編集します。

app/Controllers/Blog.php
<?php

namespace App\Controllers;

use App\Models\BlogModel;

class Blog extends BaseController
{
  public function index()
  {
    $model = new BlogModel();
    
    if ($this->request->getMethod() == 'post') {
      $model->save([
        'title' => $this->request->getVar('title'),
        'description' => $this->request->getVar('description'),
      ]);
    }

    return view('blog/index', [
      'model' => $model,
      'validation' => $model->validation,
    ]);
  }
}

テンプレートの作成

以下の通りにViewsディレクトリ内に作成したblogディレクトリ内のindex.phpを以下のように編集します。

app/Views/blog/index.php
<?= $this->extend('layouts/default') ?>
<?= $this->section('main') ?>

<?= !empty($validation) ? $validation->listErrors() : '' ?>

<?= form_open('blog/index') ?>

  <div class="form-group">
    <?= form_label('タイトル', 'title') ?>
    <?= form_input('title', set_value('title'), [
      'class' => 'form-control',
    ]) ?>
    <?php echo $validation->showError('title') ?>
  </div>

  <div class="form-group">
    <?= form_label('本文', 'description') ?>
    <?= form_textarea('description', set_value('description'), [
      'class' => 'form-control',
    ]) ?>
    <?php echo $validation->showError('description') ?>
  </div>

  <div class="form-group">
    <?= form_submit('commit', 'SAVE', [
      'class' => 'btn btn-primary',
    ]) ?>
  </div>


<?= form_close() ?>

<?= $this->endSection() ?>

上記、テンプレートのコードにある、$this->extend$this->section については以下をご確認ください。

エラーメッセージのスタイルを指定する

Codeigniter4より前のバージョンでは設定ファイルに以下のプロパティを指定してエラーメッセージの前後にHTMLタグを追加させる機能がありました。

$config['error_prefix'] = '<div class="error_prefix">';
$config['error_suffix'] = '</div>';

Codeigniter4では、テンプレート形式にカスタマズできる機能があり、デフォルトの設定では以下のテンプレートファイルを参照するようになっております。

一覧vendor/codeigniter4/framework/system/Validation/Views/list.php
単一vendor/codeigniter4/framework/system/Validation/Views/single.php

カスタマイズするにはテンプレートの参照先を指定しているところから編集します。

設定ファイルの編集

Validation.phpを以下のように編集します。

app/Config/Validation.php
・・・省略
	public $templates = [
// 以下コメントアウトするか消す
// 		'list'   => 'CodeIgniter\Validation\Views\list',  
// 		'single' => 'CodeIgniter\Validation\Views\single',
// 以下を追加
		'list' => 'App\Views\validation\list',
		'single' => 'App\Views\validation\single',
	];
・・・省略

テンプレートファイルの追加

テンプレートディレクトリに、validationディレクトリを作成し、その中に、list.php、single.phpを以下の通り追加します。

app/Views/validation/list.php
<?php if (! empty($errors)) : ?>
  <div class="errors" role="alert">
    <ul>
    <?php foreach ($errors as $error) : ?>
        <li><span class="text-danger"><?= esc($error) ?></span></li>
    <?php endforeach ?>
    </ul>
  </div>
<?php endif ?>
app/Views/validation/single.php
<span class="help-block text-danger"><?= esc($error) ?></span>

最後に

Codeigniter4のバリデーションを触ってみて以前のバージョンと比較した結果、バリデーションルールがモデル毎に管理できる点や、エラーメッセージのカスタマイズ性が柔軟になった部分にフレームワークの進化を感じました。

今回調査したバリデーションの機能は、ほんの一部です。
もっと詳しい情報を知りたい場合は、Codeigniterのドキュメントサイトをご確認ください。

Validation — CodeIgniter4 4.0.0-rc.3 documentation

コメント

タイトルとURLをコピーしました