3

この問題の解決策を見つけるために多くの時間を費やしましたが、正しい解決策が見つかりません

複数のエンティティアドレスを含めることができるユーザーエンティティがあります。Userエンティティの検証は次のように機能する必要があります。

  • ユーザーには少なくとも2つのエンティティが必要ですアドレス
  • ユーザーは最大3つのエンティティを持っている必要がありますアドレス
  • アドレスには独自の検証制約があります

両方のエンティティにはformTypeがあり、AddressはユーザーformTypeのCollectionTypeです。

現在、ユーザーコントローラーで、ビューに正しく表示される3つのアドレスを作成しています。エンティティのフォームを検証するために、「min=2」で「Assert\Count」を使用します。コントローラーで、クエリをフィルター処理して、完了していないアドレスを削除してから、フォームを検証します。このアプローチは正しくありません。フォームが無効な場合、3つのアドレスを表示できません。入力済みのアドレスしかありません。さらに、Twigでビューを作成したときにフィールドでエラーが発生することはありません

理想的なロジックは次のとおりです。アドレスが検証され、有効なアドレスのみがユーザーによって考慮されます。ユーザーは検証制約が尊重されていることを確認し、ユーザーエンティティがデータベースに保存されます。シンプルでしょ?(...まあそれは私が思ったことです)

私の問題をカバーするアイデアやブログ投稿はありますか?

編集(コメントの質問に答えるために)

ユーザーエンティティ内

<?php
//...
* @Assert\Count(
*      min=2,
*      minMessage="user_form_not_enough_addresses",
*      max=3,
*      maxMessage="user_form_too_much_addresses"
* )
*/
private $addresses;
//...

ユーザーコントローラー内(リクエストをフィルター処理する場合)

//...

// Removing not completed addresses from request
$this->_filterRequest($request);

$userType = new UserType();
$user = new User();

$userForm = $request->get($userType->getName());
foreach ($userForm['addresses'] as $address) {
    $user->getAddresses()->add(new Address());
}

$form = $this->createForm($userType, $user);
$form->bind($request);
4

1 に答える 1

1

いくつかの調査の後、唯一受け入れられる解決策は、Symfonyイベントを使用することでした。

検証とデータ記録の2つの部分を区別する必要があります。どちらの部分でも、バリデーターを使用してアドレスを検証し、見つかったエラーに基づいて何かを実行する必要があります。

検証の場合は、ファイル検証をコピーしてValidationListener.phpから、サービスを使用してファイルを照合する必要があります。次に、検証メカニズムをカスタマイズするだけです。目的は、無効であるが必須または必須ではないが、一部のフィールドが入力されているアドレスのみを表示することです。さまざまなケースを検索しViolationMapperInterface::mapViolation()、エラーを表示する必要がある場合に使用します。

データ記録の場合は、無効なアドレスをフィルタリングして、Doctrineによって考慮されないようにします(そうでない場合はSQLエラーが発生します)

于 2012-11-08T16:25:31.957 に答える