Batasan kunci komposit Symfony2 di Pembuat formulir

Di mana tempat terbaik untuk memasukkan batasan validasi kunci komposit ke dalam pembuat Formulir, yang terkait dengan entitas User FOSUserBundle?

Izinkan saya menjelaskannya.

Saya memiliki entitas User yang memperluas FOSUserBundle\Model\User. Saya menambahkan beberapa bidang (khususnya bidang team). Setiap User dimiliki tepat oleh satu Team.

Sekarang saya ingin membuat sistem registrasi yang memungkinkan pengguna menjadi anggota satu tim tertentu secara langsung (dengan memiliki rute seperti /register/{teamSlug}). Pengguna baru harus memasukkan alamat emailnya, namun email harus unik hanya pada tingkat tim. Batasan ini diterjemahkan menjadi UNIQUE KEY team_email (team_id, email) dalam database pilihan.

Secara alami, saya akan memiliki kunci unik yang ditentukan dalam tabel database, tetapi itu hanya akan memastikan bahwa tidak ada data yang dimasukkan, sambil melemparkan pengecualian database ketika upaya penulisan yang tidak valid dilakukan.

Saya mempertimbangkan untuk menggunakan atribut @UniqueEntity pada entitas User, tetapi sepertinya tidak berhasil:

(Sunting: Saya menambahkan pernyataan use yang hilang.)

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
{
    // ...
}

Hal lain yang saya temukan adalah penegasan panggilan balik. Mungkin saya bisa menggunakannya untuk memverifikasi apakah email ada dalam lingkup tim ketika validasi instance FormBuilder dengan data_class dari MyBundle\Entity\User berjalan, namun, itu akan merusak enkapsulasi Entitas karena mengharuskan Entitas mengetahui tentang Repositorinya sendiri, dan seterusnya.

Apa pendekatan terbaik untuk melakukan hal ini?


person mr.b    schedule 08.01.2016    source sumber


Jawaban (1)


entitas unik berfungsi dengan baik tetapi Anda perlu menentukan grup validasi yang tepat agar dapat berfungsi dengan pengguna 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
Saya tidak begitu jelas - saya telah menambahkan pernyataan use (tanpanya, saya terus menerima pengecualian yang sangat deskriptif). Saya telah mengedit pertanyaan saya untuk mencerminkan hal itu. Tapi, saya tidak tahu bahwa groups berlaku untuk @UniqueEntity juga. - person mr.b; 09.01.2016
comment
Sayangnya tidak ada. Saya telah menambahkan UniqueEntity seperti yang Anda katakan, menambahkan grup yang benar, mengonfigurasi Formulir untuk menggunakan grup validasi yang benar. Ketika saya mengisi bidang email dan memvalidasi formulir, ia tidak mengeksekusi kueri apa pun terhadap database (saya telah mengaktifkan pencatatan kueri mysql hanya untuk tujuan ini). - person mr.b; 10.01.2016
comment
Mungkin @UniqueEntity dipicu hanya sebelum entitas tetap ada di database? - person mr.b; 10.01.2016