PHPでバリデーションライブラリの「Varitron」を使ってみる


Valitron便利。ってことで記事に残しておく

前提

  • PHP7.3
  • Composer使える環境

概要

後でValitron使ったお問い合せフォームの記事も書く

仕事でピュアPHP書いててバリデーション0から作るのアホらしいな〜と思い、
いい感じのバリデーションライブラリ無いかと探してたら見つけました。

vlucas/valitron

スター数も多分PHPのバリデーションライブラリで一番スター付いてるんじゃ無いでしょうか(鼻ホジ)

2019 12/20現在 1.2k

インストール

早速Composer使ってインストール

php composer.phar require vlucas/valitron

vendorディレクトリにvlucasというディレクトリがあれば成功

composerじゃなくてもこのファイルをプロジェクトフォルダに置いても使えると思う(日本語化は別でしないといけないけど)

使ってみる

適当にFormRequestClassにvalidate()とかいうメソッド作ってそこで試す。

あとでお問い合せフォームの実践例も別記事で書く予定。

フォームから$postを受け取ってその値に対してバリデーションをかけていく

FormRequesrClass.php
<?php

namespace App;

require __DIR__ ."/../bootstrap.php";

use Valitron;

class FormRequestClass
{
    protected $post;
    protected $validator;

    public function __construct(array $post)
    {
        $this->post = $post;
    }

    // バリデーション処理
    public function validate() : ? array
    {
        // 日本語に設定
        Valitron\Validator::lang("ja");
        $this->validator = new Valitron\Validator($this->post);

        // 必須項目のチェック
        $this->validator->rule("required", $this->formItems())->message('{field}は必須項目です');
        // フリガナの形式チェック
        $this->validator->rule("regex", "name_kana", "/^[ァ-ヾ\s ]+$/u")->message('{field}を正しく入力してください');
        // 電話番号の形式チェック
        $this->validator->rule("regex", "tel", "/\A0[0-9]{9,10}\z/")->message('{field}を正しく入力してください');
        // メールアドレスの形式チェック
        $this->validator->rule("email", ["email", "verify_email"])->message('{field}はメールアドレス形式で入力してください');
        // メールアドレスと確認用メールアドレスの一致チェック
        $this->validator->rule("equals", "email", "verify_email")->message('{field}が一致しません');

        // ラベルを定数ファイルの内容に変換
        $this->validator->labels([
            "name"         => "名前",
            "name_kana"    => "フリガナ",
            "email"        => "E-Mail",
            "verify_email" => "確認用E-Mail",
            "tel"          => "電話番号"
        ]);

        // エラーチェック
        if ($this->validator->validate()) {
            $errors = [];
        } else {
            $errors = $this->validator->errors();
        }

        return $errors;
    }

    // フォームの必須項目
    protected function formItems() : array
    {
        return [
            "name",
            "name_kana",
            "email",
            "verify_email",
            "tel"
        ];
    }

}

validate()メソッドではそれぞれの項目に対してバリデーションを行なっている。

使い方説明

上記のコードを上から順に説明

日本語設定

Valitron\Validator::lang("ja");

引数で入力値を渡してインスタンス化

$this->validator = new Valitron\Validator("ここに$_POSTをぶち込む");

バリデーション設定

$this->validator->rule("バリデーション名", "項目名(配列も可能)")->message("エラーメッセージ");

ラベルを設定

初期はnameで表示されるので日本語でエラー出すなら必須な気がする

$this->validator->labels("項目名(配列も可能)");

エラーチェック

// エラーチェック
if ($this->validator->validate()) {
    $errors = [];
} else {
    $errors = $this->validator->errors();
}

結果に対してエラーがなければ$errorsに空の配列を渡して、エラーがあれば$errorsにエラー結果が入ってくる。

最後に

しつこいけど後でValitron使った実践的なお問い合わせフォームの記事も書く