毎日漫然な愚者

少ない時間で挑むGNO2とモンハン日記ばかり?

symfony form Doctrine sfValidatorNumberとマルチバイトと俺

2009-04-18 04:02:18 | Weblog
なんだかよくわからんタイトルだw
で、内容は今日はまったこと。

内容と結果をわかりやすく記すためのschema.ymlがこれ。
※論点がずれるので、「性別はフラグで充分だろ!」とか、
 「年齢はintでいいだろ!」等のつっこみはなしです。
User:
  tableName: user
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true
    sex: string(2)
    age: string(3)

で、これを元にして作ったformが、
class UserForm extends BaseUserForm
{
  public function configure()
  {
    $this->widgetSchema['age'] = new sfWidgetFormInput();
    $this->validatorSchema['age'] = new sfValidatorString();
 
    $sexes = array(
      '男性' => '男性',
      '女性' => '女性',
    );
    $this->widgetSchema['sex'] = new sfWidgetFormChoice(array(
      'choices'  => $sexes,
      'expanded' => true,
    ));
    $this->validatorSchema['sex'] = new sfValidatorChoice(array(
      'choices' => array_keys($sexes),
    ));
 
  }
}

となったとして、
それぞれ、sex='男性'、age='30'となるように入力し、submitします。

で、ここからがハマった話。

1、sexの文字数が長いと怒られる


これはなにかというと、バリデーション後のデータ登録時に、
Doctrine側でもスキーマ定義に基づいてバリデーションを実施しているのだが、
そこで、「文字数が長いぞ( ゜Д゜)ゴルァ!!」ということ。

・・・まぁ、マルチバイトを扱うときはよくある話なので、
粛々とここを参考にして、strlen関数をmb_strlenでオーバーロードし、
apacheを再起動。


まだ解決しない?
原因は違うってこと??(゜Д゜;)

慌てて調べたところ、こんな記事を発見。
要は「Doctrineでは文字数をカウントする際にiconv>mbstring>strlenの優先順でおこなう」ということです。
で、iconvの内部文字コードのデフォルトは'ISO-8859-1'なので、
よって、configに以下を追加。

iconv_set_encoding("internal_encoding", "UTF-8");


これで、Doctrineに怒られなくなるはずだったんだけど…

2、PDOステートメントからcharacter varying(3)と怒られる


『意味がわからん…
あ、いや、エラーの意味はわかるけど入力値は'男性'と'30'なんで、
文字数を超えるはずがない。』と思いつつ、メッセージに従い、
ageフィールドを'9'に定義しなおして再度登録実行。
無事登録されたので、実登録された値を確認すると…
age
30.000000

…ん?
……んっん~??
………( ゜д゜)ハッ!

なんで、浮動小数点付きになっとんね~~~~ん!!!!(ノ ゜Д゜)ノ ==== ┻━━┻



とややキレぎみに調べたマニュアルに書いてありました。
読めば、sfValidatorNumberでバリデーションされた値は、浮動小数に変換するとあります。
で、整数固定の場合は、sfValidatorIntegerが用意されています。

ガ━━━━━━∑(゜д゜lll)━━━━━━ン
…だったら、sfValidatorNumberなんて紛らわしいもんを例文に使うなよ。
…いや、つーか、この文章からだと、エラー時にしか変換されないようにしか思わんだろ。

……(*´д`;)…ハイハイ、マニュアル読んでない私が悪いんですよ。( `д´) ケッ!

最新の画像もっと見る