2011-09-29 64 views
5

我想驗證一些表單中需要唯一的字段 - 用戶名和電子郵件地址。如果我提交表單,我會收到數據庫錯誤。我想使用一個驗證器,就像我做的一切 - 現在我試圖在對象中使用自定義getters和isvalidUsername函數,並且我不確定在對象中使用實體管理器是否是實現此目的的最佳方法。繼承人什麼我與迄今的工作...Symfony 2獨特的驗證程序

Frontend\UserBundle\Entity\User: 
     properties: 
      email: 
        - NotBlank: ~ 
        - Email: ~ 
     username: 
      - NotBlank: ~ 
     getters: 
       validUsername: 
        - "True": { message: "Duplicate User detected. Please use a different username." } 
       validEmail: 
        - "True": { message: "Duplicate email detected. Please use a different email." } 

有建在fosuserbundle獨特的驗證,但我一直無法弄清楚如何使用它們。

回答

1

首先,我建議你使用FOSUserBundle。它非常靈活,你可以節省一些時間,通過修復細微的錯誤並測試一切是否按預期工作。

無論如何,如果你真的想自己構建它,至少可以通過上面提到的包來激發靈感。他們定義custom validator並檢查UserManagervalidateUnique)中的唯一性。此外,您必須將其註冊爲service,以通過構造函數注入來提供UserManager。然後,您只需使用它作爲正常的class validator

5

我知道這是一個老問題,但我不得不解決這個問題,所以我想我會分享我的解決方案。

我不喜歡使用的任何軟件包來處理我的用戶,所以這是我的手動方法:

<?php 
namespace MyCorp\CorpBundle\Entity; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\Email; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** User - Represent a User object */ 
class User implements AdvancedUserInterface { 

    /** @var integer $id */ 
    private $id; 

    /** @var string $email */ 
    private $email; 

    /** Constructor, Getters, Setters etc... */ 

    /** Set a list of rules to use when validating an instance of this Class 
     @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */ 
    public static function loadValidatorMetadata(ClassMetadata $metadata) { 

     $metadata->addPropertyConstraint('email', new MaxLength(255)); 
     $metadata->addPropertyConstraint('email', new NotBlank()); 
     $metadata->addPropertyConstraint('email', new Email()); 

     $metadata->addConstraint(new UniqueEntity(array(
      "fields" => "email", 
      "message" => "This email address is already in use") 
     )); 

    } 

} 

正如你可以看到我定義模型本身我的驗證。 Symfony會呼叫loadValidatorMetadata讓你加載驗證器。

+0

這對我有用。也許在這種情況下使用FOSUserBundle會更好,但是我只想對某個東西拍一個唯一性驗證器,而不會搞亂所有這些,而且這個技巧。謝謝。 –

+0

我發現這個解決方案似乎有什麼問題:如果您嘗試更新現有的用戶記錄,您會收到一個錯誤消息,說明電子郵件地址已被使用,當然這不應該發生。 –

+0

此解決方案正在爲我工​​作,編輯和所有,所以我不知道發生了什麼。我直到星期二才能檢查我的代碼,但我會看看我是否可以看到任何東西 – OrganicPanda

0

存在UniqueEntity驗證約束,用於確保用戶爲特定屬性提供唯一值。

有關使用Symfony支持的各種格式的示例,請參閱documentation。以下是使用註釋的示例:

// Acme/UserBundle/Entity/Author.php 
namespace Acme\UserBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\Mapping as ORM; 

// DON'T forget this use statement!!! 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Entity 
* @UniqueEntity("email") 
*/ 
class Author 
{ 
    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * @Assert\Email() 
    */ 
    protected $email; 

    // ... 
}