日別アーカイブ: 05/09/2013

symfony2 Assert customizing messages

EntityのバリデーションのAssertで通らなかった時に指定するメッセージ文字列、これにplaceholderを使えないか検索してみたんだけどどうやらできない模様。時間がなくてソースコードまでは確認してない

例えば、こんな事をしたいと思った

/*
 * @Assert\True(message = "未登録部門 {{ value }}")
 */
public function isValidDepartmentNumber() {
  return (valid) ? true : false;
}

もちろん、これは出来ないでのそのまま {{ value }} という文字列がエラーとして表示される

ウェブ上のフォームの場合は入力文字列(送信した値)が画面上に出ているだろうから、あえて何がバリデーションで失敗したかなんてエラー文字列に入れる必要はない。しかし今回はバッチ的な処理の中でEntityをいくつも作成してそれを検証する形だったので、まとめた処理のエラーを出す場合に単純なエラー原因だけでは何がどういった理由でエラーになったのか非常に分かりづらいという問題に陥った

こんな処理

for (someloop) {
  // validate
  $errors = $this->container->get('validator')->validate($entity);
  if (count($errors) > 0) {
    // if error, stack error list
    foreach ($errors as $error) {
       $this->errors[] = $error->getMessage();
    }
  }
}

結局ちょう場当たり的な対応をした

for (someloop) {
  // validate
  $errors = $this->container->get('validator')->validate($entity);
  if (count($errors) > 0) {
    // if error, stack error list
    foreach ($errors as $error) {
      $_str = $error->getMessage();
      // custom error messaging
      $_str = preg_replace("/{{ value }}/", ' ('.$entity->getDepartmentNumber().')', $_str);
      $this->errors[] = $_str;
    }
  }
}

symfony2関連のサンプルコードってまだまだ少ない感じがするなぁ