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);
}