fuelphpでNGワードのvalidationを実装したのでメモ

やりたかったこと

タイトルのとおりですが、投稿系のサイトだとNGワードのチェックをいれてほしいという要望が意外と多いので次実装するときのためにメモしておく。
NGワードの保存先はデータベースでもファイルでもどちらでもいいと思うが今回は予め配列などに定義しておく

実装

バリデーションを定義する。
vi fuel/app/classes/util/validations.php

class Util_Validations
{
    public static function _validation_ngword($val, $ng_words)
    {
        $ng_pattern = '';
        foreach ($ng_words as $v) {
            $ng_pattern .= preg_quote($v,'/') . '|';
        }
        if (!$ng_pattern) {
            return true;
        }
        if (preg_match_all('/' . substr($ng_pattern,0,-1) . '/',$val,$matches)) {
            return false;
        }
        return true;
    }
}

コントローラでvalidationを設定
vi fuel/app/classes/controller/sample.php

$ng_words = array("ほげ","ふが","hoge");

$val = Validation::forge();
$val->add_callable('Util_Validations');
$val->add('name', '名前')->add_rule('ngword',$ng_words);
if (!$val->run()) {
    // 入力エラー
}

こんな風に実装しておけば別の箇所でも使い回しできるので便利かと思います。
ちなみにfuel/app/classes/util/validations.phpというのは僕が勝手に使ってるルールなので、、、以下のページを参考にしてもらえればと思います


fuelphpで必ずやってる設定などまとめ - とりあえずphpとか

以上です