Laravel4 カスタムValidator

カスタムValidatorの実装方法
少しだけ苦戦したのでメモ

ここでは試しにmb_strlenでの文字列長のバリデーター「mb_digits_between」を作る

<?php

class Hoge extends BaseController {
    public function hoge()
    {
        $input = Input::all();
        $rules = array(
            'name'   => 'required|mb_digits_between:1,100',
        );
        $validator = Validator::make($input, $rules);
        if ($validator->fails()) {
            
        }

こんな感じで呼び出したいよね。

まずバリデーションの内容を書くファイルを準備
ファイル名と場所・メソッド名は適当
app/extension/CustomValidator.php

<?php

namespace App\Extension;

class CustomValidator extends \Illuminate\Validation\Validator
{
    public function validateMbDigitsBetween($attribute, $value, $parameters)
    {
        $this->requireParameterCount(2, $parameters, 'mb_digits_between');
        $len = mb_strlen($value);
        return $len >= $parameters[0] && $len <= $parameters[1];
    }

    protected function replaceMbDigitsBetween($message, $attribute, $rule, $parameters)
    {
        return str_replace(array(':min', ':max'), $parameters, $message);
    }
}

こういうのを作っておく
validateXxxxメソッドがバリデーター
replaceXxxxメソッドはエラーのメッセージなど用
エラーメッセージで:min :maxを使わないのであれば不要
(エラーメッセージはapp/lang/en/validation.phpなどを参照)

app/filters.php

<?php
...

Validator::resolver(function($translator, $data, $rules, $messages)
{
    return new \App\Extension\CustomValidator($translator, $data, $rules, $messages);
});

上の文を追加。
filters.phpに追加したけど、このファイル自体は
app/start/global.phpの最下部で読まれているので、同じように読み込むファイルを作ってそれに記述すれば動くような気がする。
というかそっちの方がいい気がするけど、めんどくさがるダメ人間

http://laravel.com/docs/validation#custom-validation-rules
ここに書いてあると言えば書いてあるんだけど、わかりにくい…。