สถานที่ที่ดีที่สุดในการแทรกข้อจำกัดการตรวจสอบความถูกต้องของคีย์ผสมลงในตัวสร้างแบบฟอร์มที่เชื่อมโยงกับเอนทิตี 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 ของตัวเอง และอื่นๆ
แนวทางที่ดีที่สุดในการทำเช่นนี้คืออะไร?