Kohana 2.2 の Validation で callbacks を追加する注意点

callbacks に追加するユーザー関数がクラスメソッドの場合、アクセス修飾子は public にする必要がある。
よく考えれば、その通りなのだが…。

アクセス修飾子を private や protected にしているとエラーが発生する

<?php
defined('SYSPATH') or die('No direct script access.');
class Test_Controller extends Controller {
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $_POST = null;
        // 疑似 $_POST データを生成する
        $_POST = array(
            'tel' => '090-0300-0000',
            'url' => 'http://www.google.co.jp/',
            'price' => '1000',
            'name' => ' 名無し太郎');
        $post = new Validation($_POST);
        // $_POST['name'] で trim 関数を使ってスペースを削除する
        $post->pre_filter('trim', 'name');
        $post->add_rules('tel',   'required', 'alpha_dash');
        // URL 形式のチェックが甘い
        // callback を利用して確認をしたほうがよい
        $post->add_rules('url',   'required', 'url');
        // digit のため、負数の場合はエラーが発生する
        $post->add_rules('price', 'required', 'digit');
        $post->add_rules('name',  'required', 'standard_text', 'length[1,6]');

        // callbacks を追加する
        $post->add_callbacks('price', array($this, 'my_callbacks'));

        if ($post->validate()) {
            echo 'good';
        } else {
            echo '不正なデータが投稿されました。';
            $errors = $post->errors();
            foreach ($errors as $key => $value) {
                echo $key . '' . $value . 'でエラーが起きました。';
            }
        }
    }

    // Validation は引数が Validation オブジェクトであることを示している
    // see http://jp.php.net/manual/ja/language.oop5.typehinting.php
    private function my_callbacks(Validation $post)
    {
         if (array_key_exists('email', $post->errors()) {
             // すでにエラーがあるのがわかっている場合は、callbacks を終了させる
             return;
         } else {
             if (preg_match('/^[0-9]{1,4}$/', $_POST['price']) === false) {
                  // 不正な形式ならば、エラーメッセージを追加する
                  $post->add_error('email', 'my_callbacks');
             }
        }
    }
}
?>
system/libraries/Validation.php [547]:
call_user_func(Test_Controller::validate_phone_number_format) [function.call-user-func]: First argument is expected to be a valid callback

アクセス修飾子が public なら正しく成功する

<?php
defined('SYSPATH') or die('No direct script access.');
class Test_Controller extends Controller {

    public function my_callbacks(Validation $post)
    {
         if (array_key_exists('email', $post->errors()) {
             // すでにエラーがあるのがわかっている場合は、callbacks を終了させる
             return;
             if (preg_match('/^[0-9]{1,4}$/', $_POST['price']) === false) {
                  // 不正な形式ならば、エラーメッセージを追加する
                  $post->add_error('email', 'my_callbacks');
             }
         }
    }
}
?>