Validasi adalah ciri model Laravel Eloquent yang memastikan bahwa model memenuhi kriteria validasinya sebelum disimpan. Jika tidak dianggap valid, model tidak akan disimpan dan kesalahan validasi akan tersedia.
Validasi memungkinkan beberapa kumpulan aturan, memasukkan ID model ke dalam aturan validasi unique
dan memunculkan pengecualian pada validasi yang gagal. Ini kecil dan fleksibel agar sesuai dengan alur kerja Anda dan membantu Anda hanya menyimpan data yang valid.
Ingin menggunakan Validasi di Laravel 4.2+? Lihatlah cabang 0.10.x untuk dokumentasi dan petunjuk instalasi.
Versi Laravel 4.2 lebih cocok untuk melakukan validasi form; ini mendukung pesan validasi khusus, aturan konfirmasi, dan beberapa kumpulan aturan. Karena Laravel 5.0 memiliki validasi FormRequest
Validasi sekarang dirancang untuk menjaga validitas data inti Anda dan menyerahkan validasi formulir pada kerangka kerja.
Ingin menggunakan Validasi pada Laravel 5.0 hingga 5.2? Lihatlah cabang 2.x untuk dokumentasi dan instruksi instalasi.
Versi Laravel 5.0 - 5.2 menggunakan kontrak ValidationException
yang sudah tidak digunakan lagi dari kerangka Laravel. Untuk Laravel 5.3 kami sekarang memperluas validasi inti ValidationException
yang berarti kerangka kerja akan secara otomatis mengarahkan kembali dengan kesalahan ketika kesalahan validasi terjadi, seperti yang dilakukan FormRequest
.
Baca terus - petunjuk ini untuk Anda!
Cukup buka direktori proyek Anda tempat file composer.json
berada dan ketik:
komposer memerlukan watson/validasi
Lihat instruksi instalasi untuk Laravel 4.2+. Lihat instruksi instalasi untuk Laravel 5.0 - 5.2.
Pertama, tambahkan sifat ke model Anda dan tambahkan aturan validasi dan pesan sesuai kebutuhan.
gunakan WatsonValidatingValidatingTrait;class Post extends Eloquent { gunakan ValidatingTrait; dilindungi $rules = [ 'title' => 'wajib', 'slug' => 'wajib|unik:postingan,slug', 'konten' => 'wajib' ]; }
Anda juga dapat menambahkan sifat tersebut ke BaseModel
jika Anda menggunakannya dan sifat tersebut akan berfungsi pada semua model yang diturunkan darinya, jika tidak, Anda dapat memperluas WatsonValidatingValidatingModel
alih-alih Eloquent
.
Catatan: Anda perlu menyetel properti $rules
pada model apa pun yang diperluas dari BaseModel
yang menggunakan sifat tersebut, atau menyetel array kosong sebagai $rules
untuk BaseModel
. Jika tidak, Anda pasti akan berakhir dengan LogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
.
Sekarang, Anda memiliki akses ke beberapa fungsi yang menyenangkan.
// Periksa apakah modelnya valid atau tidak.$post->isValid(); // true// Atau periksa apakah tidak valid atau tidak.$post->isInvalid(); // false// Setelah Anda menentukan validitas model, // Anda bisa mendapatkan error.$post->getErrors(); // kesalahan Tas Pesan
Validasi model juga menjadi sangat sederhana.
if ( ! $post->save()) {// Ups.return redirect()->route('posts.create') ->denganKesalahan($posting->getErrors()) ->denganInput(); }return redirect()->route('posts.show', $post->id) ->withSuccess("Postingan Anda berhasil disimpan.");
Jika tidak, jika Anda lebih suka menggunakan pengecualian saat memvalidasi model, Anda dapat menggunakan metode saveOrFail()
. Sekarang, pengecualian akan dimunculkan ketika Anda mencoba menyimpan model yang tidak valid.
$post->saveOrFail();
Anda tidak perlu menangkap pengecualian , jika Anda tidak mau. Laravel mengetahui cara menangani ValidationException
dan secara otomatis akan mengarahkan kembali dengan input formulir dan kesalahan. Jika Anda ingin menanganinya sendiri, Anda bisa.
coba {$post->saveOrFail(); } catch (WatsonValidatingValidationException $e) {$errors = $e->getErrors();return redirect()->route('posts.create') ->denganKesalahan($kesalahan) ->denganInput(); }
Perhatikan bahwa Anda cukup meneruskan pengecualian ke metode withErrors()
seperti withErrors($e)
dan Laravel akan mengetahui cara menanganinya.
Jika Anda menggunakan model dan ingin melakukan penyimpanan yang melewati validasi, Anda bisa melakukannya. Ini akan mengembalikan hasil yang sama seperti jika Anda memanggil save()
pada model tanpa sifat tersebut.
$post->forceSave();
Jika Anda lebih memilih pengecualian yang diberikan secara default saat menggunakan metode save()
daripada harus menggunakan saveOrFail()
Anda cukup menyetel properti berikut pada model atau BaseModel
Anda.
/** * Apakah model harus memunculkan ValidationException jika * gagal validasi. Jika tidak disetel, defaultnya adalah false. * * @var boolean */dilindungi $throwValidationExceptions = true;
Jika Anda ingin melakukan penyimpanan satu kali menggunakan pengecualian atau nilai kembalian, Anda dapat menggunakan metode saveOrFail()
dan saveOrReturn
.
Untuk menampilkan pesan kesalahan validasi khusus, cukup tambahkan properti $validationMessages
ke model Anda.
/** * Pesan validasi untuk diteruskan ke validator. * * @var array */protected $validationMessages = ['slug.unique' => "Posting lain sudah menggunakan slug itu."];
Anda mungkin memperhatikan kami menggunakan aturan unique
pada slug, yang tidak akan berfungsi jika kami memperbarui model yang ada. Untungnya, Validasi akan menangani hal ini untuk Anda dan menambahkan kunci utama model ke aturan sehingga aturan akan berfungsi seperti yang diharapkan; mengabaikan model saat ini.
Anda dapat menyesuaikan fungsi ini dengan mengatur properti $injectUniqueIdentifier
pada model Anda.
/** * Apakah model harus memasukkan pengidentifikasinya ke aturan validasi * unik sebelum mencoba validasi. Jika properti * ini tidak disetel dalam model, maka properti ini akan default ke true. * * @var boolean */dilindungi $injectUniqueIdentifier = true;
Secara langsung, kami mendukung aturan unique
yang disediakan Laravel. Kami juga mendukung aturan felixkiss/uniquewith-validator yang populer, namun Anda harus ikut serta. Cukup tambahkan use WatsonValidatingInjectorsUniqueWithInjector
setelah Anda mengimpor sifat validasi.
Sangat mudah untuk mendukung aturan injeksi tambahan juga, jika Anda mau. Katakanlah Anda ingin mendukung aturan tambahan yang disebut unique_ids
yang hanya mengambil kunci utama model (untuk alasan apa pun). Anda hanya perlu menambahkan aturan dengan huruf unta yang menerima parameter apa pun yang ada dan nama bidang, dan mengembalikan aturan pengganti.
/** * Siapkan aturan Unique_ids, tambahkan pengidentifikasi model jika diperlukan. * * @param array $parameters * @param string $field * @return string */fungsi yang dilindungi PrepareUniqueIdsRule($parameters, $field) {// Hanya lakukan penggantian jika model masih ada.if ($this->exists) {return 'unique_ids:' . $ini->getKey(); }kembalikan 'unique_ids'; }
Dalam hal ini jika model telah disimpan dan memiliki kunci utama 10
, aturan unique_ids
akan diganti dengan unique_ids:10
.
Berbagai peristiwa dipicu oleh sifat tersebut selama proses validasi yang dapat Anda kaitkan untuk memengaruhi proses validasi.
Untuk terhubung, pertama-tama Anda perlu menambahkan properti $observeables
ke model Anda (atau model dasar). Ini hanya memberi tahu Eloquent bahwa model Anda dapat merespons peristiwa ini.
/** * Peristiwa yang dapat diamati oleh pengguna terekspos * * @var array */dilindungi $observables = ['validasi', 'divalidasi'];
Ketika validasi akan terjadi, peristiwa eloquent.validating: ModelName
akan diaktifkan, di mana parameter $event
akan saving
atau restoring
. Misalnya, jika Anda memperbarui model AppUser
dengan namespace, acaranya adalah eloquent.validating: AppUser
. Jika Anda mendengarkan salah satu peristiwa ini dan mengembalikan nilai, Anda dapat mencegah terjadinya validasi sepenuhnya.
Event::listen('eloquent.validating:*', function($model, $event) {// Validasi rolet Pseudo-Rusia.if (rand(1, 6) === 1) {return false; } });
Setelah validasi terjadi, ada juga serangkaian peristiwa validated
yang dapat Anda ikuti, untuk peristiwa passed
, failed
, dan skipped
. Untuk contoh validasi gagal di atas, Anda bisa mendapatkan acara eloquent.validated: AppUser
.
Saat ini terdapat bug di Laravel (lihat masalah #1181) yang mencegah kejadian model diaktifkan lebih dari sekali dalam rangkaian pengujian. Artinya, pengujian pertama yang menggunakan pengujian model akan lulus, namun pengujian berikutnya akan gagal. Ada beberapa solusi sementara yang tercantum di thread tersebut yang dapat Anda gunakan agar pengujian Anda lulus untuk sementara.
Karena Laravel telah beralih ke Liferaft untuk tujuan melacak bug dan permintaan penarikan, masalah yang disebutkan di atas mungkin tidak tersedia. Intisari ini memiliki contoh TestCase.php
yang menunjukkan kepada Anda cara mengatur ulang kejadian semua model Anda di antara pengujian sehingga berfungsi seperti yang diharapkan.
Ada beberapa cara yang dapat Anda lakukan untuk menggunakan model validasi validasi di pengontrol Anda, namun berikut adalah salah satu contoh yang menggunakan FormRequest baru di Laravel 5 (jika Anda ingin melihat contoh pengontrol lain tanpa FormRequest, centang versi 4.2+ dari paket ini.
Contoh ini menjaga kode Anda tetap bersih dengan mengizinkan FormRequest menangani validasi formulir Anda dan model menangani validasinya sendiri. Dengan mengaktifkan pengecualian validasi, Anda dapat mengurangi kode pengontrol berulang (blok coba/tangkap) dan menangani pengecualian validasi model secara global (permintaan formulir Anda harus menjaga model Anda tetap valid, jadi jika model Anda menjadi tidak valid, ini merupakan kejadian luar biasa ).
<?php namespace AppHttpControllers; gunakan AppHttpRequestsPostFormRequest; gunakan IlluminateRoutingController; kelas PostsController memperluas Kontroler {melindungi $post;fungsi publik __construct(Posting $post) {$ini->postingan = $postingan; }// ...penyimpanan fungsi publik(PostFormRequest $request) {// Postingan akan memunculkan pengecualian jika tidak valid.$post = $this->post->create($request->input());// Postingan berhasil disimpan.return redirect()->route( 'postingan.tampilkan', $postingan); } }
Anda kemudian dapat menangkap pengecualian validasi model di app/Exceptions/Handler.php
Anda dan menanganinya sesuai kebutuhan.
render fungsi publik($permintaan, Pengecualian $e) {if ($e instanceof WatsonValidatingValidationException) {return back()->withErrors($e)->withInput(); }induk::render($permintaan, $e); }