Laravel Validation メモ


Validation Rule をホントによく忘れるのでメモ書き。Laravel5.1で書いてます。

see: [https://laravel.com/docs/5.1/validation#available-validation-rules](https://laravel.com/docs/5.1/validation#available-validation-rules)

## 画像ファイルか確認する

`image` を使う

## PDF ファイルか確認する

`mimes:pdf` を使う

## メールアドレスか確認する

`email`を使う

## 他のフィールドとは別の値にする

例えば、`A` は `B` とは別の値にする必要がある場合の指定

```php
[
  'A' => 'different:B'
]
```

## Checkbox に値があるか確認する

`accepted` を使う。 `yes`/`1`/`true`のいずれかの値であれば良い。

- HTML側 `<input type='checkbox' name='hoge' value='1' />` 

## 日付になっているか確認

`date` を使う。フォーマットが少し変わっている場合などは `date_format:format` を使う。

ただし、平成N年などは対応していないから、Validationを新しく作る必要あり。

## 数字3ケタのみ受け付ける。もしくは3ケタ以上4ケタ未満のみ受け付ける。

`digits:3` を使い、`digits_between:3,4` とする。

## DBに存在している値か確認する

`exists:table,field` を使う。`where` 句も追加できて、`exists:table,field,delete_at,NULL`や`exists:table,field,delete_at,NOT_NULL`も可。

## 別フィールドと同じ値か確認

パスワード再入力とかに利用？

`same:other_field` を使う。

## 値がそのテーブルの指定フィールドでまだ入っていない値かチェックする

メールアドレス重複などで利用する。

`unique:table,field`

- メールアドレス重複の確認などで使う場合、ユーザ自身のidを省く必要がある。その方法。

	`'unique:user,email,' . $user->id`

- idのフィールド名が違うなどの場合

	`'unique:user,email,' . $user->id . ',user_id'`

- 有効になっているアカウントのみから絞り込む

	`'unique:user,email,NULL,id,active,1'`
	
	この場合は `select count(*) from user where email = :input and active = 1` になる

## 今日より前の日付のみ受け付ける

多分こんな感じ。`strtotime` で `DateTime` にできる値ならいい。

`'before:' . Carbon::now()->format('Y-m-d 00:00:00')`

## 明日以降の日付のみ受け付ける

`'after:' . Carbon::now()->addDay(1)->format('Y-m-d 00:00:00')`

## 幾つかの値のみ受け付ける

A,B,C のいずれかのみ受け付ける

`'in:' . implode(',', [ 'A', 'B', 'C' ])`

## 幾つかの値以外を受け付ける

A,B,C 以外を受け付ける

`not_in:A,B,C`

## 半角数字のみ受け付ける

`integer`

## 有効なURLか確認する

`active_url`

## パスワード確認

例えばパスワードフォームが`password`で、validationルールに`confirmed`がある場合、パスワード確認用フォーム`password_confirmation`の値と比較をする。

例：

```html
<div class="form-group">
    <label for="password" class="col-sm-2 control-label">新しいパスワード</label>
    <div class="col-sm-10">
        <?= Form::password( 'password', [
                'class' => "form-control",
                'id'    => 'password'
        ] ) ?>
    </div>
</div>

<div class="form-group">
    <label for="password_check" class="col-sm-2 control-label">新しいパスワード(確認)</label>
    <div class="col-sm-10">
        <?= Form::password( 'password_confirmation', [
                'class' => "form-control",
                'id'    => 'password_check'
        ] ) ?>
    </div>
</div>
```

バリデーションルールは下記のようにする

```php
[
    'password' => 'required|confirmed|min:6'
]
```

## チェックが入っている場合は必須にする

`A`というチェックボックスにチェックが有れば、`AText` の値は必須にする

```php
[
  'AText' => 'required_if:A,1'
]
```

## チェックが入っている場合は入力してはいけない

`A`というチェックボックスにチェックが有れば、`AText` の値は入っててはいけない

```php
[
  'AText' => 'required_unless:A,1'
]
```

## 半角カタカナのみ受け付ける

ちょっと工夫が必要。`AppServiceProvider ` の `boot` メソッドに `Validator`を拡張して`kana`を追加して利用する。

```AppServiceProvider.php
<?php

namespace App\Providers;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // カタカナのみ受け付ける
        \Validator::extend( "kana", function ($attribute, $value, $parameters, $validator){
            // 参考
            // http://pentan.info/php/reg/is_kana.html
            // http://aspiration.sakura.ne.jp/wiki/index.php?develop%2FUTF-8%E3%81%B2%E3%82%89%E3%81%8C%E3%81%AA%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A%E8%A1%A8
            // http://orange-factory.com/sample/utf8/code3-ef.html
            // \xef\xbc[\x90-\x99] => 全角数字
            // \xe3\x82[\xa1-\xbf]|\xe3\x83[\x80-\xbe] => カタカナ
            // \xef\xbd[\xa6-\xbf]|\xef\xbe[\x80-\x9f] => ｦ -> ﾟ の半角カタカナ
            $regex = '{^(
                (\xe3\x82[\xa1-\xbf]) # カタカナ
               |(\xe3\x83[\x80-\xbe]) # カタカナ
               |(\xef\xbc[\x90-\x99]) # 全角数字
               |(\xef\xbd[\xa6-\xbf]) # 半角カタカナ
               |(\xef\xbe[\x80-\x9f]) # 半角カタカナ
               |[0-9a-zA-Z ]     # 半角英数字空白
               |(\xe3\x80\x80)   # 全角スペース
            )+$}x';
            $result = preg_match( $regex, $value, $match );
            if ($result === 1) {
                return true;
            }

            return false;
        } );
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

```