Inilah saveAction
kode saya (di mana formulir meneruskan data ke)
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
Pertanyaan saya adalah: bagaimana saya mendapatkan kesalahan jika $form->isValid()
kembali false
?
error_bubbling
ke true dalam jenis formulir Anda dengan secara eksplisit menyetel opsi untuk setiap bidang.$form->getErrors(true)
dapat memasukkan kesalahan formulir anak jugaSymfony 2.3 / 2.4:
Fungsi ini mendapatkan semua kesalahan. Yang ada di formulir seperti "Token CSRF tidak valid. Harap coba kirim ulang formulir." serta tambahan error berupa children yang tidak memiliki error menggelembung.
Untuk mendapatkan semua kesalahan sebagai string:
Symfony 2.5 / 3.0:
Dokumen:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (di bagian bawah:
The method Form::getErrorsAsString() was removed
)sumber
$errors[$child->getName()] = $this->getErrorMessages($child);
melontarkan pengecualian, karena getErrorMessages hilang dari komponen Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller . Jadi saya menggantinya dengan$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
dan saya pikir itu dipanggil langsung di dalam pengontrol dan bagian dari api Symfony.Di bawah ini adalah solusi yang berhasil untuk saya. Fungsi ini ada di pengontrol dan akan mengembalikan larik terstruktur dari semua pesan kesalahan dan bidang yang menyebabkannya.
Symfony 2.0:
Symfony 2.1 dan yang lebih baru:
sumber
$this->getFormErrors
harus$this->getErrorMessages
dalam sampel Anda di Symfony2.1Gunakan Validator untuk mendapatkan kesalahan untuk entitas tertentu
Referensi API:
sumber
Untuk mendapatkan pesan yang tepat (dapat diterjemahkan), saat ini menggunakan SF 2.6.3, berikut adalah fungsi terakhir saya (karena tidak ada satu pun di atas yang tampaknya berfungsi lagi):
karena metode Form :: getErrors () sekarang mengembalikan turunan FormErrorIterator , kecuali Anda mengganti argumen kedua ($ flatten) menjadi true . (Ini kemudian akan mengembalikan instance FormError , dan Anda harus memanggil metode getMessage () secara langsung, tanpa metode current ():
)
Hal yang paling penting sebenarnya adalah menyetel argumen pertama menjadi benar untuk mendapatkan kesalahan. Membiarkan argumen kedua ($ flatten) ke nilai defaultnya ( true ) akan mengembalikan contoh FormError , sementara itu akan mengembalikan contoh FormErrorIterator ketika disetel ke false.
sumber
Untuk pesan flash saya, saya senang
$form->getErrorsAsString()
Edit (dari Benji_X80): Untuk penggunaan SF3
$form->getErrors(true, false);
sumber
This method should only be used to help debug a form.
( sumber )Fungsi untuk symfony 2.1 dan yang lebih baru, tanpa fungsi yang tidak digunakan lagi:
sumber
IF
pernyataan pertama ? Mengapa itu saling eksklusif? Sejauh yang saya bisa lihat: bentuk bisa memiliki kesalahannya sendiri seperti halnya anak-anak.Pesan Kesalahan Formulir yang Diterjemahkan (Symfony2.1)
Saya telah berjuang keras untuk menemukan informasi ini, jadi saya pikir perlu menambahkan catatan tentang terjemahan kesalahan formulir.
@Icode4food
jawaban akan mengembalikan semua kesalahan formulir. Namun, array yang dikembalikan tidak memperhitungkan pluralisasi atau terjemahan pesan .Anda dapat memodifikasi foreach loop of
@Icode4food
answer menjadi combo:Ini dia:
Jawaban ini telah dikumpulkan dari 3 postingan berbeda:
sumber
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Saya curiga ini hanya untuk Symfony 2.1?SYMFONY 3.X
Metode SF 3.X lain yang diberikan di sini tidak berfungsi untuk saya karena saya dapat mengirimkan data kosong ke formulir (tetapi saya memiliki kendala NotNull / NotBlanck). Dalam hal ini string kesalahan akan terlihat seperti ini:
Yang tidak terlalu berguna. Jadi saya membuat ini:
Yang akan mengembalikan itu:
sumber
Anda juga dapat menggunakan layanan validator untuk mendapatkan pelanggaran batasan:
sumber
Pesan Kesalahan Formulir yang Diterjemahkan (Symfony2.3)
Versi saya untuk memecahkan masalah:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
Di Symfony 2.5 Anda bisa mendapatkan semua kesalahan bidang dengan sangat mudah:
sumber
Untuk Symfony 3.2 dan yang lebih baru gunakan ini,
Gunakan str_replace jika Anda ingin menyingkirkan teks ' Kesalahan: ' yang mengganggu di setiap teks deskripsi kesalahan.
sumber
Jika Anda menggunakan validator khusus, Symfony tidak mengembalikan kesalahan yang dibuat oleh validator tersebut di
$form->getErrors()
.$form->getErrorsAsString()
akan mengembalikan semua kesalahan yang Anda butuhkan, tetapi sayangnya keluarannya diformat sebagai string, bukan array.Metode yang Anda gunakan untuk mendapatkan semua kesalahan (terlepas dari mana asalnya), bergantung pada versi Symfony yang Anda gunakan.
Sebagian besar solusi yang disarankan melibatkan pembuatan fungsi rekursif yang memindai semua bentuk anak, dan mengekstrak kesalahan yang relevan ke dalam satu larik. Symfony 2.3 tidak memiliki
$form->hasChildren()
fungsi tersebut, tetapi ia memiliki$form->all()
.Berikut adalah kelas pembantu untuk Symfony 2.3, yang dapat Anda gunakan untuk mengekstrak semua kesalahan dari bentuk apa pun. (Ini didasarkan pada kode dari komentar oleh yapro pada tiket bug terkait di akun github Symfony.)
Kode panggilan:
sumber
Berdasarkan jawaban @Jay Seth, saya membuat versi class FormErrors khusus untuk Ajax Forms:
Penggunaan (misalnya dalam tindakan Anda):
Versi Symfony: 2.8.4
Contoh respon JSON:
Objek kesalahan berisi bidang "kunci", yang merupakan id dari elemen DOM masukan, sehingga Anda dapat dengan mudah mengisi pesan kesalahan.
Jika Anda memiliki formulir anak di dalam formulir induk, jangan lupa untuk menambahkan
cascade_validation
opsi di dalam formulir induksetDefaults
.sumber
Untuk Symfony 2.1 dan seterusnya untuk digunakan dengan tampilan kesalahan Twig, saya mengubah fungsi untuk menambahkan FormError daripada hanya mengambilnya, dengan cara ini Anda memiliki kontrol lebih besar atas kesalahan dan tidak harus menggunakan error_bubbling pada setiap input individu. Jika Anda tidak menyetelnya dengan cara di bawah ini {{form_errors (form)}} akan tetap kosong:
sumber
$ form-> getErrors () bekerja untuk saya.
sumber
Saya datang dengan solusi ini. Ia bekerja dengan baik dengan Symfony 2.4 terbaru .
Saya akan mencoba memberikan beberapa penjelasan.
Menggunakan validator terpisah
Saya rasa itu ide yang buruk untuk menggunakan validasi terpisah untuk memvalidasi entitas dan mengembalikan pesan pelanggaran batasan, seperti yang disarankan oleh penulis lain.
Anda perlu memvalidasi semua entitas secara manual, menentukan grup validasi, dll, dll. Dengan bentuk hierarki yang kompleks, ini sama sekali tidak praktis dan akan lepas kendali.
Dengan cara ini Anda akan memvalidasi formulir dua kali: sekali dengan formulir dan sekali dengan validator terpisah. Ini adalah ide yang buruk dari perspektif kinerja.
Saya menyarankan untuk mengulang jenis formulir secara rekursif dengan anak-anaknya untuk mengumpulkan pesan kesalahan.
Menggunakan beberapa metode yang disarankan dengan pernyataan IF eksklusif
Beberapa jawaban yang disarankan oleh penulis lain berisi pernyataan IF yang saling eksklusif seperti ini:
if ($form->count() > 0)
atauif ($form->hasChildren())
.Sejauh yang saya bisa lihat, setiap bentuk bisa memiliki kesalahan seperti halnya anak-anak. Saya tidak ahli dengan komponen Formulir Symfony , tetapi dalam praktiknya Anda tidak akan mendapatkan beberapa kesalahan dari formulir itu sendiri, seperti kesalahan perlindungan CSRF atau kesalahan bidang tambahan . Saya menyarankan untuk menghapus pemisahan ini.
Menggunakan struktur hasil yang didenormalisasi
Beberapa penulis menyarankan untuk meletakkan semua kesalahan di dalam array biasa. Jadi semua pesan kesalahan dari formulir itu sendiri dan dari anaknya akan ditambahkan ke larik yang sama dengan strategi pengindeksan yang berbeda: berbasis nomor untuk kesalahan tipe itu sendiri dan berbasis nama untuk kesalahan anak. Saya menyarankan untuk menggunakan struktur data yang dinormalisasi dalam bentuk:
Hasil dengan cara itu dapat dengan mudah diulang nanti.
Solusi saya
Jadi, inilah solusi saya untuk masalah ini:
Saya harap ini akan membantu seseorang.
sumber
SIMFONI 3.1
Saya hanya menerapkan metode statis untuk menangani tampilan kesalahan
Berharap bisa membantu
sumber
Symfony 3 dan yang lebih baru
Saya baru-baru ini membuat fungsi yang membuat pohon kesalahan formulir. Ini akan membantu untuk mengembalikan daftar kesalahan kembali ke ujung depan. Ini didasarkan pada jenis formulir yang memiliki:
Kode:
Keluaran:
Perhatian : Saya tahu bahwa kesalahan dari bidang tingkat yang lebih dalam dapat ditimpa jika tingkat yang lebih tinggi memiliki kesalahan, tetapi ini ditujukan untuk penggunaan saya.
sumber
Untuk Symfony 2.1:
Ini adalah solusi terakhir saya dengan mengumpulkan banyak solusi lain:
sumber