今回調べたルール

  • confirmed
  • date
  • date_format:フォーマット
  • different:フィールド
  • digits:値
  • digits:最小値,最大値
  • dimensions
  • distinct
  • email
  • exists

confirmed

$this->validateSame()を使って一致するかどうかを検証しています。第3引数に$attribute.'_confirmation'を渡していますので、確認用のフィールドのname属性は、「確認したいフィールド名 + confirmation」となります。

使い方はこうです。

date

checkdate関数で取得した日付の妥当性を判定しています。その日付はdate_parse関数により配列で取得できます。

スラッシュ区切りとハイフン区切りはtrueになります。ドット区切りはfalseです。

date_format:フォーマット

入力された日付が指定のフォーマットであればtrueになります。

例えば、ドット区切りの場合はこうなります。

この場合は、2016.12.31なら問題ないです。たとえ日付として正しいものだとしてもフォーマットが違うならfalseになります。なので、2016/12/312016-12-31falseです。

different:フィールド

指定のフィールドと値が異なっている場合にtrueを返します。

digits:値

入力した値が指定の長さだった場合にtrueを返します。例えば、digits:5の場合、入力した値が12345ならtrueです。

注意したいのが、strlen関数はバイト数を返すということです。なので、上記の例では半角ならtrueですが、全角ならfalseになります。

digits_between:最小値,最大値

digits:値に範囲指定できるようになったのがこのルールです。最小値と最大値を指定します。「=」を含みますので、digits_between:1,5の場合、1から5でtrueになります。

dimensions

パラメータで指定したサイズ(高さ、幅)かどうかをバリデートします。

まず、$this->isAValidFileInstance()でファイルインスタンスかどうか判定します。また、getimagesize関数で画像の情報を取得します。

指定可能なパラメータは次のようになっています。

  • width
  • min_width
  • max_width
  • height
  • min_height
  • max_height
  • ratio

ratioは縦横比の指定になります。指定方法は分数(横 / 縦)かfloatです。

使い方は以下になります。

distinct

対象のフィールドが配列で、要素に重複があるとfalseを返します。また、多次元配列はドット区切りで指定したり、プレースホルダーとして*を使うこともできます。

受け取った配列をArr::whereでループ処理させます。Arr::whereは、array_filter関数を使うためのラッパーです。

array_filterはコールバックがfalseを返した場合、配列から削除されます。

そして、array_filterを通した配列を、array_valuesを使って数字添え字の配列にし、その配列に最初の値が含まれるかどうかで判定しています。

使い方は以下になります。

また、入力した値を保持するためにold()を使うのですが、配列なのでold('foo')[0]となります。関数に続けて配列の番地を指定するのは少々気持ち悪いですね。もっと良い書き方があれば教えてください。

email

メールアドレスのバリデーションですね。もはや説明不要に近いほどご存知ではないでしょうか。

phpのfilter_varという関数を使っています。この関数の第2引数にフィルタオプションを指定すると、そのオプションでフィルタリングしてくれます。今回のようにメールアドレスをバリデーションするならFILTER_VALIDATE_EMAILを指定します。

使い方は以下になります。

exists

フィールドの値が指定のデータベースに存在すればtrueを、存在しないならfalseを返します。

$connectionは接続先のデータベース、$tableはテーブル名、$columnはカラム名、$expectedは判定に使う変数です。 $this->getExistCount()で取得した数字と$expectedの数字の比較で判定してることがわかります。

使い方に癖があるルールですが、次のコードを見れば使い方がおおよそわかります。

まずは基本形です。

入力した値がusersテーブルのemailカラムに存在するかどうかを判定します。フィールド名(HTML)とカラム名(DB)が一致していると、このように書くことができます。

続いて、テーブルとカラムを指定する場合です。

入力した値がusersテーブルのaddressカラムに存在するかどうかを判定します。

さらにデータベースを指定する場合です。

入力した値がconnectionデータベースのusersテーブルのaddressカラムに存在するかどうかを判定します。テーブル名の前に.(ドット)で区切って指定しています。

もっと条件とつけたいときはこうします。

これで作成されるSQLが次のようになります。

SELECT count(*) FROM users WHERE address = "<入力した値>" AND account_id = 1

そのほか、こういう書き方もできます。

これで作成されるSQLが次のようになります。

SELECT count(*) FROM users WHERE email = "<入力した値>" AND (account_id = 1 AND group_id = 2)

この場合、カラムの指定はできないのでフィールド名(HTML)とカラム名(DB)が一致している必要があります。

ここで、作成されたSQLで取得できるのはレコード数です。つまり$this->getExistCount()で取得される数のことです。この数と最初にでてきた$expctedを比較して判定しているんですね。

まとめ

今回紹介したルールでよく使われるのは、confirmedemailだと思います。登録フォームでよく見かけますね。

あとは適宜、といったところでしょうか。