ข้อ จำกัด คีย์คอมโพสิต Symfony2 ในตัวสร้างแบบฟอร์ม

สถานที่ที่ดีที่สุดในการแทรกข้อจำกัดการตรวจสอบความถูกต้องของคีย์ผสมลงในตัวสร้างแบบฟอร์มที่เชื่อมโยงกับเอนทิตี User ของ FOSUserBundle คืออะไร

ให้ฉันอธิบายอย่างละเอียด

ฉันมีเอนทิตี User ซึ่งขยาย FOSUserBundle\Model\User ฉันเพิ่มหลายช่อง (ช่อง team โดยเฉพาะ) User แต่ละรายการเป็นของ Team หนึ่งรายการเท่านั้น

ตอนนี้ผมอยากสร้างระบบลงทะเบียนให้ผู้ใช้สามารถเป็นสมาชิกของทีมใดทีมหนึ่งได้โดยตรง (โดยมีเส้นทางเช่น /register/{teamSlug}) ผู้ใช้ใหม่ต้องป้อนที่อยู่อีเมลของตน แต่อีเมลจะต้องไม่ซ้ำกันในระดับทีมเท่านั้น ข้อจำกัดนี้แปลเป็น UNIQUE KEY team_email (team_id, email) ในฐานข้อมูลที่เลือก

โดยปกติแล้ว ฉันจะมีคีย์เฉพาะที่กำหนดไว้ในตารางฐานข้อมูล แต่จะทำให้แน่ใจว่าไม่มีการแทรกข้อมูลใด ๆ ในขณะที่ส่งข้อยกเว้นฐานข้อมูลเมื่อมีการพยายามเขียนที่ไม่ถูกต้อง

ฉันพิจารณาใช้แอตทริบิวต์ @UniqueEntity ในเอนทิตี User แต่ดูเหมือนว่าจะไม่ทำงาน:

(แก้ไข: ฉันได้เพิ่มคำสั่ง use ที่หายไป)

use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 * @UniqueEntity(
 *     fields={"email", "team"},
 *     message="This email already exists in this team."
 * )
 */
class User extends BaseUser
{
    // ...
}

อีกสิ่งหนึ่งที่ฉันพบคือ การยืนยันการโทรกลับ บางทีฉันอาจใช้มันเพื่อตรวจสอบว่ามีอีเมลอยู่ในขอบเขตทีมหรือไม่ เมื่อตรวจสอบความถูกต้องของอินสแตนซ์ FormBuilder ด้วยการรัน data_class ของ MyBundle\Entity\User ซึ่งจะทำลายการห่อหุ้มของ Entity เนื่องจากเอนทิตีต้องรู้เกี่ยวกับ Repository ของตัวเอง และอื่นๆ

แนวทางที่ดีที่สุดในการทำเช่นนี้คืออะไร?


person mr.b    schedule 08.01.2016    source แหล่งที่มา


คำตอบ (1)


เอนทิตีที่ไม่ซ้ำกันทำงานได้ดี แต่คุณต้องกำหนดกลุ่มการตรวจสอบที่ถูกต้องเพื่อให้ทำงานกับผู้ใช้ fos

@UniqueEntity(
       fields={"email", "team"},
       groups={"Registration", "Profile"},
       message="This email already exists in this team."
  )
person Marino Di Clemente    schedule 08.01.2016
comment
ฉันไม่ชัดเจนนัก - ฉันได้เพิ่มคำสั่ง use แล้ว (หากไม่มี ฉันยังคงได้รับข้อยกเว้นที่สื่อความหมายอย่างมาก) ฉันได้แก้ไขคำถามของฉันเพื่อสะท้อนถึงสิ่งนั้น แต่ฉันไม่รู้ว่า groups ใช้ได้กับ @UniqueEntity เช่นกัน - person mr.b; 09.01.2016
comment
น่าเสียดาย - ไม่ ฉันได้เพิ่ม UniqueEntity ตามที่คุณพูด เพิ่มกลุ่มที่ถูกต้อง กำหนดค่าแบบฟอร์มเพื่อใช้กลุ่มการตรวจสอบความถูกต้อง เมื่อฉันเติมฟิลด์อีเมลและตรวจสอบแบบฟอร์ม มันจะดำเนินการค้นหาเป็นศูนย์กับฐานข้อมูล (ฉันได้เปิดใช้งานการบันทึกการสืบค้น mysql เพื่อจุดประสงค์นี้เท่านั้น) - person mr.b; 10.01.2016
comment
บางที @UniqueEntity อาจถูกทริกเกอร์ก่อนที่จะคงเอนทิตีไว้ในฐานข้อมูลเท่านั้น - person mr.b; 10.01.2016