簡體   English   中英

Symfony2中的CollectionType驗證

[英]CollectionType validation in Symfony2

我花了很多時間找到解決這個問題的方法,但我沒有找到正確的解決方案

我有一個可以包含多個實體地址的用戶實體。 User實體的驗證應該像這樣:

  • 用戶必須至少有兩個實體地址
  • 用戶必須最多有三個實體地址
  • 地址有自己的驗證約束

兩個實體的formType和Address都是User formType中的CollectionType。

目前,我在我的用戶控制器中創建了3個在視圖中正確顯示的地址。 我使用'Assert \\ Count'和'min = 2'來驗證實體中的表單。 在我的控制器中,我過濾查詢以刪除尚未完成的地址,然后我驗證表單。 這種方法不正確。 如果表單無效,我無法顯示3個地址,我只有已完成的地址。 此外,當我使用Twig創建視圖時,字段中沒有錯誤

理想情況下邏輯如下:地址經過驗證,用戶只考慮有效地址。 用戶檢查其驗證約束是否受到尊重,然后User實體存儲在數據庫中。 簡單吧? (......那就是我的想法)

您有任何想法或博客文章可以解決我的問題嗎?

編輯(回答評論中的問題)

在用戶實體中

<?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);

經過一些研究,唯一可接受的解決方案是使用Symfony事件。

我們必須區分兩部分:驗證和數據記錄。 在這兩個部分中,您必須使用驗證程序驗證地址,並根據找到的錯誤執行某些操作。

在驗證的情況下,您必須復制文件驗證ValidationListener.php然后使用服務來匹配您的文件。 然后只需自定義驗證機制。 目標是僅顯示無效但需要或不需要的地址但是填充了一些字段,只搜索不同的情況並在顯示錯誤時使用ViolationMapperInterface::mapViolation()

在數據記錄的情況下,只需過濾無效地址,以確保Doctrine不會考慮它們(否則會導致SQL錯誤)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM