なんだかよくわからんタイトルだw
で、内容は今日はまったこと。
内容と結果をわかりやすく記すためのschema.ymlがこれ。
※論点がずれるので、「性別はフラグで充分だろ!」とか、
「年齢はintでいいだろ!」等のつっこみはなしです。
で、これを元にして作ったformが、
となったとして、
それぞれ、sex='男性'、age='30'となるように入力し、submitします。
で、ここからがハマった話。
これはなにかというと、バリデーション後のデータ登録時に、
Doctrine側でもスキーマ定義に基づいてバリデーションを実施しているのだが、
そこで、「文字数が長いぞ( ゜Д゜)ゴルァ!!」ということ。
・・・まぁ、マルチバイトを扱うときはよくある話なので、
粛々とここを参考にして、strlen関数をmb_strlenでオーバーロードし、
apacheを再起動。
?
まだ解決しない?
原因は違うってこと??(゜Д゜;)
慌てて調べたところ、こんな記事を発見。
要は「Doctrineでは文字数をカウントする際にiconv>mbstring>strlenの優先順でおこなう」ということです。
で、iconvの内部文字コードのデフォルトは'ISO-8859-1'なので、
よって、configに以下を追加。
これで、Doctrineに怒られなくなるはずだったんだけど…
『意味がわからん…
あ、いや、エラーの意味はわかるけど入力値は'男性'と'30'なんで、
文字数を超えるはずがない。』と思いつつ、メッセージに従い、
ageフィールドを'9'に定義しなおして再度登録実行。
無事登録されたので、実登録された値を確認すると…
…ん?
……んっん~??
………( ゜д゜)ハッ!
とややキレぎみに調べたマニュアルに書いてありました。
読めば、sfValidatorNumberでバリデーションされた値は、浮動小数に変換するとあります。
で、整数固定の場合は、sfValidatorIntegerが用意されています。
ガ━━━━━━∑(゜д゜lll)━━━━━━ン
…だったら、sfValidatorNumberなんて紛らわしいもんを例文に使うなよ。
…いや、つーか、この文章からだと、エラー時にしか変換されないようにしか思わんだろ。
……(*´д`;)…ハイハイ、マニュアル読んでない私が悪いんですよ。( `д´) ケッ!
で、内容は今日はまったこと。
内容と結果をわかりやすく記すための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なんて紛らわしいもんを例文に使うなよ。
…いや、つーか、この文章からだと、エラー時にしか変換されないようにしか思わんだろ。
……(*´д`;)…ハイハイ、マニュアル読んでない私が悪いんですよ。( `д´) ケッ!