読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

【PHP】メソッドチェーンで、記述できる バリデーションクラスChainValidatorを作った

PHP バリデーション オブジェクト指向 ValueObject

f:id:secret_hamuhamu:20150404170600p:plain
メソッドチェーンで、記述できる記述できる バリデーションクラスChainValidatorを作ってみた。

作ったきっかけ

  • 毎回、バリデーション書くのがめんどくさい
  • 汎用的にバリデーションロジック部分のみ書き換えたい

自分にとって理想なバリデーション機構を目指したというところです。
Githubに上げたので、issueやpull reqestお待ちしております!!
https://github.com/hamuhamu/ChainValidator

動作環境

  • PHP >=5.3

動作検証してないけど、PHP 5.3以上なら動くはず。

Usage

テストコード見れば、使い方がわかると思います。
https://github.com/hamuhamu/ChainValidator/blob/51aee4ffc3b511da7e10f7006e40401d1ebcca80/tests/FormValidatorTest.php

<?php
namespace ChainValidator;
class FormValidatorTest extends \PHPUnit_Framework_TestCase
{
    /** @test */
    public function バリデーション違反がなければから配列を返すこと()
    {
        $validator = new FormValidator();
        $validator
            ->addRule(FormValidator::ZIP_CODE, '123-1111',   '郵便番号に誤りがあります')
            ->addRule(FormValidator::DATE,     '2015-11-11', '日付に誤りがあります');
        $errors = $validator->valid();
        $this->assertTrue(empty($errors));
    }
    /** @test */
    public function バリデーション違反があれば、違反したルールを返すこと()
    {
        $validator = new FormValidator();
        $validator
            ->addRule(FormValidator::ZIP_CODE, 'xxx-1111',   '郵便番号に誤りがあります')
            ->addRule(FormValidator::DATE,     '2015-11-11', '日付に誤りがあります');
        $errors = $validator->valid();
        $expected = [];
        $expected[] = new ValidateRule(FormValidator::ZIP_CODE, 'xxx-1111',   '郵便番号に誤りがあります');
        // objectの比較のためassertEquals
        $this->assertEquals($expected, $errors);
    }
}
class FormValidator extends ChainValidator
{
    const ZIP_CODE = 'validZipCode';
    const DATE     = 'validDate';
    public function validZipCode($validateValue)
    {
        $rule = '/\A\d{3}\-\d{4}\z/';
        return (bool) preg_match($rule, $validateValue);
    }
    public function validDate($validateValue)
    {
        $rule = '/\A\d{4}-\d{2}-\d{2}\z/';
        return (bool) preg_match($rule, $validateValue);
    }
}

ChainValidatorを継承させて、具象クラスに validZipCode など独自のバリデーションを実装します。
バリデーション違反であれば、バリデーション違反だった設定をオブジェクト( ValidateRule ) の配列で返します。

表現方法を豊かにするためにオブジェクトにしています。
Value Objectですね。
連想配列だと中に何が入っているのか?確認するのにvar_dumpしたりしないといけないです。

まとめ

どのように実装したか説明してないので、興味あればコード読んでください。
もっといい実装あるよってご意見ある方、pull reqestお待ちしております!!

https://github.com/hamuhamu/ChainValidator

おすすめの本

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

  • 作者: ThoughtWorks Inc.,株式会社オージス総研オブジェクトの広場編集部
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/12/27
  • メディア: 単行本(ソフトカバー)
  • 購入: 14人 クリック: 323回
  • この商品を含むブログ (81件) を見る

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

テスト駆動開発入門

テスト駆動開発入門

  • 作者: ケントベック,Kent Beck,長瀬嘉秀,テクノロジックアート
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2003/09
  • メディア: 単行本
  • 購入: 45人 クリック: 1,058回
  • この商品を含むブログ (161件) を見る