

Silex 2.x でフォームの入力内容をバリデーションしています。  
翻訳内容は YAML で保存しているため下記のようにして読み込んでいます。

[code]

    $app->register(new Silex\Provider\ValidatorServiceProvider());
    $app->register(new Silex\Provider\LocaleServiceProvider());
    $app->register(new Silex\Provider\TranslationServiceProvider(), array(
        'locale' => "ja"
    ));
    $app['translator'] = $app->extend('translator', function($translator, $app) {
        $translator->addLoader('yaml', new Symfony\Component\Translation\Loader\YamlFileLoader());
    
        $translator->addResource('yaml', __DIR__ . '/../resources/lang/ja.yml', "ja", 'validators');
    
        return $translator;
    });
    
[/code]

チェック箇所

[code]

    $inputs = [
        "name" => $request->get("name")
    ];
    
    $constraint = new Assert\Collection([
        'name' => new Assert\NotBlank()
    ]);
    
    $errors = $app['validator']->validate($inputs, $constraint);
    foreach($errors as $error){
        echo $error->getMessage();
    }
    
[/code]

ja.yml ファイルに

[code]

    This value should not be blank.: 値が空です。
    
[/code]

と書くことで getMessage()
の結果を日本語化するところまで出来ましたが、例えば名前欄が空の場合「名前が空です。」といった表現をしたいと思っています。  
Laravel のときは「:attribute の値 ”:value” は正しくありません」のような書き方をすることが出来ましたが、Silex
ではどのようにするのが一般的なのでしょうか？

$error->getPropertyPath() を $app['translator']->trans()
で翻訳して「:attribute」等のプレースホルダーをstr_replace()
で置き換えれば一応の形にはなりそうですが正しい方法ではないように思えます。

いい方法がありましたらよろしくお願いします。


CC BY-SA 3.0
2016-12-07T03:02:40.843
30975
2016-12-23T14:46:35.440
2016-12-07T04:55:31.117
10083
10083
question
php symfony2 silex
Silexでのバリデーションメッセージの日本語化


フィールド（プロパティ）ごとにエラーメッセージを設定したい場合は、下記のように制約のコンストラクタに渡すオプション配列で独自のエラーメッセージを指定できます。

[code]

    $constraint = new Assert\Collection([
        'name' => new Assert\NotBlank(['message' => '名前が空です']),
    ]);
    
[/code]

独自のエラーメッセージの中でユーザーによる入力値を使いたい場合は `{{ value }}` というプレースホルダで参照できます。

[code]

    $constraint = new Assert\Collection([
        'age' => new Assert\Range(['min' => 18, 'message' => '18歳未満は利用できません（{{ value }}歳と入力されています）']),
    ]);
    
[/code]


CC BY-SA 3.0
2016-12-23T14:46:35.440
31341
2016-12-23T14:46:35.440
5518
30975
answer