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'); } } } } ?>