gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

before_filter的なほにゃらら、の想定

元ネタは、友人の

会員登録に住所が必要な場合の「数字は全角で」「数字は半角で」もそろそろどうにかならんのか

ってあたりの発言。


まぁ実際「住所入力全角のみ」で、番地数半角ではねられていらついたとかいうケースは割と後を絶たないわけでして。
その辺りを考えると、入力値受け取る時に
・半角になぁれ
・全角になぁれ
・カンマ(,)はいらねぇっつってんだろ!!(数値入力)
など、いくつか定型的な「事前に置換したり除去したりしたいパターン」ってのはあるような気がするんですね。
記憶をほっくり返しても確かに組んでた記憶があるし。


んで「なら、set_valueあたりでフックして、自動で置換したり除去したりすればいいんぢゃね?」って思いましたのが事の発端。
実装イメージ的にはvalidateと似ている感じかなぁ。


設定は、set_element() 辺りで

  $this->push_before_filter('hoge', 定数 | 定数); // 
  $this->push_before_filter('foo',  定数 | 定数); // 
  $this->push_before_filter('bar',  定数 | 定数); // 

的な感じで。


後は、普通にset_valueするタイミングで逐次、filterが適用される的な。
微妙に悩んでるのは、以下のあたり。


本来的には「手で入力した際」のフック用、なのだよねぇ。
それを考えると、なんとなし「set_from_cgi*()」がフック場所なのだけど。
「手動で普通にごりごりとset_valueしてるコード」の存在もあり得るので、そうすると「フック場所はset_value」のほうが、性能を考えなければ、より確実。
ただ「すでにfilter済みのデータも毎回filter」ってのも些か処理的に重いのでは? ってのもあって。
そうすると「フック場所はset_valueで、引数にフラグを追加、"明示的にfilterをすっ飛ばす"オプションがある」にするとよいのかなぁと思うんだけど、「手間」なのと「DBからの入力なんだけど信用できない」とかいう特殊ケースをどうすっかなぁ? 的な問題。


とりあえず今のところ何となく
・フック場所はset_value
・引数に「明示的に指定すると"filterを通さない"意思表示が出来る」ように改造
・data_clumpがもっている、いくつかのメソッドは「filterを通さない」「filterを通さなくする事ができる」ように改造
って方向かなぁ、と思ってる。
あとは作ってみて使ってみて改良かなぁ?


filterは、候補としては
・数値を全て半角にする
・数値を全て全角にする
・英字を全て半角にする
・英字を全て全角にする
・英字を全て「大文字」にする(最終データが半角データのみ)
・英字を全て「小文字」にする(最終データが半角データのみ)
・全角スペースを「半角」に変換
・半角スペースを「全角」に変換
・全角カタカナを「全角ひらがな」に変換
・全角ひらがなを「全角カタカナ」に変換
・半角カタカナを「全角ひらがな」に変換
・半角カタカナを「全角カタカナ」に変換
・全角の長音の類い(調べないと…)をハイフン(半角)に変換
・全角の長音の類い(調べないと…)を長音(ー)に変換:揃える、とも言う
・ハイフン(半角)を長音(ー)に変換
・カンマを除去する(半角、全角とも)
・スペースを除去する(半角全角とも)
・改行を除去する(\r\nとも)
くらいかなぁ?
まぁ必要に応じてこの辺も追加。


単純に「必要要素」だけだと面倒な気もするので。
セットメニュー的なのも作っておくと良さそうかも。
・「数値を全て半角」+「英字を全て半角にする」+「全角スペースを「半角」に変換」+「全角の長音の類い(調べないと…)をハイフン(半角)に変換」の、「半角セット」
とかとか。
セット的には
・半角セット
・全角セット
・半角数値入力セット(半角数値系+カンマ除去)
あたりがとりあえず有力かなぁ。


あと、もっと大前提として「filter」でいいのかしらん? 的な、命名の問題。

「before_filter」って名前も、微妙におよそと混ざりそうで、幾分躊躇してる感じw
なんかいい命名ないかしらん?
意味合いとしては「入力されたデータを、置換したり一部除去したりして整えたり揃えたりする」感じ。


…なんてことを、もわもわ。
意見コメント突っ込みその他、ありましたらお気軽に是非!!