2011-12-04 2 views
1

내 개체의 유효성을 검사 할 때 중복 된 이름의이 없도록 할 엔티티 클래스의 엔티티 관리자에 액세스하는 것입니다는 올바른 (중복 이름이 없도록하기 위해)

/** 
* @var string $name 
* 
* @ORM\Column(name="name", type="string", length=32) 
* @Assert\NotBlank(); 
* @Assert\Callback(methods={"isUniqueUsername"}) 
*/ 
private $name; 

나는 내가 검사기 콜백을 사용할 필요가 가정합니다. 그런 다음 엔티티 관리자가 필요하므로 해당 사용자 이름으로 데이터베이스를 쿼리해야합니다. 어떻게 접근합니까? 그리고 "올바르게"액세스하십시오. 유효성 검사기 클래스를 대신 사용합니까? 1 필드의 유효성을 검사하기위한 클래스를 만드는 것은 상당히 번거로운 것 같습니다.

답변

5

symfony2에는 사용자 이름, 전자 메일 주소 또는 다른 필드가 고유하다는 것을 확인하는 데 사용할 수있는 고유 한 유효성 검사기가 있습니다. 주석을 사용하면 다음과 같이 작동

use Symfony\Bridge\Doctrine\Validator\Constraints as Unique; 

/** 
* @ORM\Entity 
* @ORM\Table 
* @Unique\UniqueEntity(fields={"email"},message="Your email is already registered") 
*/ 
class User{ 
    // ... 
} 

형태를 통해 사용자를 추가하려고, 당신은 고유 주석에 언급 된 메시지를 받아야합니다.

+0

사용자 이름, 이메일 및 displayName이 고유해야하는 경우'fields = { "username", "email", "displayName"}'을 입력하겠습니까? 고유 한 의미로 2 명의 동일한 사용자 이름을 사용해서는 안됩니다. (그룹으로는 의미가 없습니다. 고유 한 상태가 여전히 필요합니다.) –

+0

내 머리 꼭대기부터 3 회 정의해야한다고 말할 수 있습니다. Unique \ UniqueEntity 한 번에 하나의 필드. – Sgoettschkes

4

엔티티 내에서 엔티티 관리자를 사용하면 안됩니다.이 엔티티 관리자는 Separation of Concerns를 해제합니다. 엔티티 클래스는 엔티티를 간단히 설명해야하는 POPO (일반 오래된 PHP 객체)입니다. 이는 지속성과 관련된 어떤 것도 책임지지 않아야합니다. 사용자 정의 조회를 실행해야하는 경우, 저장소 클래스 나 별도의 서비스에서 수행하십시오. 저장소 클래스는 이미 엔티티 관리자에 액세스 할 수 있습니다. 커스텀 서비스를 사용한다면 엔티티 관리자를 삽입하면됩니다.

+0

제 경우에는 어떤 것이 더 적절합니까? 서비스 또는 저장소? 고유 한 사용자 이름/이메일에 대해 유효성을 검사하고 있습니다. –

관련 문제