Rumah > pembangunan bahagian belakang > tutorial php > Pengesahan Data di Laravel: Cara yang betul - Pengesahan tersuai

Pengesahan Data di Laravel: Cara yang betul - Pengesahan tersuai

Christopher Nolan
Lepaskan: 2025-02-20 11:35:11
asal
291 orang telah melayarinya

3

Takeaways Key Data Validation in Laravel: The Right Way - Custom Validators

Pakej Pengesahan Data yang dibina Laravel boleh diperluaskan untuk membuat peraturan pengesahan tersuai untuk keperluan khusus, seperti mengesahkan nama penuh atau kod pin yang termasuk ruang. Pengesahan Data di Laravel: Cara yang betul - Pengesahan tersuai

Peraturan pengesahan tersuai dicipta dengan memperluaskan kelas IlluminateValidationValidator Laravel dan menambah kaedah baru untuk mengesahkan data dan mesej ralat masing -masing.

Peraturan pengesahan baru mesti dinamakan dengan awalan 'validate' dan seluruh nama dalam kes tajuk. Peraturan pengesahan akan menjadi huruf kecil dari apa yang dinamakan kaedah (tanpa awalan 'mengesahkan') dan setiap perkataan akan dipisahkan oleh garis bawah.
  • Selepas membuat peraturan pengesahan tersuai, pembekal perkhidmatan perlu dibuat untuk mengikat peraturan ini ke dalam pakej pengesahan Laravel. Penyedia perkhidmatan ini kemudian dimuatkan oleh Laravel melalui fail app/config/app.php.
  • Di bahagian sebelumnya, kami belajar bagaimana untuk mengesahkan data di Laravel menggunakan pakej pengesahan data yang dibina dan bagaimana untuk mengaplikasikan pengesahan data kami kepada perkhidmatan khusus entiti untuk menjadikan kod itu boleh digunakan semula pada prinsip kering. Sekarang, kami dapat dengan mudah membuat perkhidmatan pengesahan untuk setiap entiti dalam aplikasi kami dengan peraturan pengesahan masing -masing, menyuntikkannya di mana sahaja kami ingin mengesahkan data dan mudah mengambil dan memaparkan ralat dan lain -lain
  • Tetapi bagaimana jika kita mahukan lebih banyak?

Kod sumber untuk tutorial ini boleh didapati di sini. Anda hanya perlu menjalankan pemasangan komposer untuk memasang rangka kerja Laravel di dalam direktori projek sebelum anda dapat menjalankan kod ini.

Keperluan untuk lebih banyak

keluar dari kotak, Laravel menyediakan banyak peraturan pengesahan yang berguna dan generik. Tetapi bagaimana jika kita mahukan lebih banyak? Bagaimana jika kita memerlukan sesuatu yang lebih spesifik? Dalam contoh kami di sini, dalam testFormValidator kami telah menggunakan alpha_dash untuk mengesahkan nama tetapi itu tidak sesuai untuk mengesahkan nama penuh. Umumnya, nama penuh seseorang akan terdiri daripada nama pertama dan nama terakhir dan mungkin nama tengah juga. Semua ini akan dipisahkan oleh ruang. Begitu juga jika kita mahu mengesahkan kod pin dalam bentuk kita, kita tidak boleh menggunakan peraturan alpha_num yang disediakan oleh Laravel, kita harus membenarkan ruang di dalamnya juga.

Nah, Laravel menyediakan pilihan untuk dengan mudah melanjutkan pakej pengesahannya dan menambah peraturan pengesahan tersuai kepadanya. Dalam RocketCandy/Services/Validation/Buat ValidatoreXtended.php dan tambahkan kod berikut kepadanya:
<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator;
</span></span><span>
</span><span><span>class ValidatorExtended extends IlluminateValidator {
</span></span><span>
</span><span>	<span>private $_custom_messages = array(
</span></span><span>		<span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.",
</span></span><span>		<span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.",
</span></span><span>	<span>);
</span></span><span>
</span><span>	<span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>		<span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>
</span><span>		<span>$this->_set_custom_stuff();
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Setup any customizations etc
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@return <span>void</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function _set_custom_stuff() {
</span></span><span>		<span>//setup our custom error messages
</span></span><span>		<span>$this->setCustomMessages( $this->_custom_messages );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, spaces and dashes (hyphens and underscores)
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaDashSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, numbers, and spaces
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaNumSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
Salin selepas log masuk
Salin selepas log masuk

di sini kelas kami memanjangkan kelas IlluminateValidationValidator Laravel dan menambah dua kaedah baru (ValidatealPhadashSpaces () dan ValidateAlphanumspaces ()) untuk mengesahkan data dan mesej ralat masing -masing dengan pemegang tempat: atribut yang akan menggantikannya dengan nama yang mana medan data yang disahkan.

Sekarang perkara yang perlu diperhatikan di sini adalah bagaimana kita menamakan kaedah. Semua nama kaedah peraturan pengesahan mesti mempunyai awalan mengesahkan dan selebihnya mestilah dalam kes tajuk (tanpa ruang, tentu saja). Peraturan pengesahan akan berada dalam huruf kecil dari kaedah yang dinamakan (tanpa awalan pengesahan) dan setiap perkataan akan dipisahkan oleh garis bawah. Jadi jika kita mahu menambah peraturan pengesahan alpha_dash_spaces maka kaedah yang sepadan kita akan dinamakan validatealphadashspaces ().

jadi kami telah menambah alpha_dash_spaces dan alpha_num_spaces peraturan pengesahan di sini. Alpha_dash_spaces akan membolehkan huruf, sengkang (tanda hubung dan garis bawah) dan ruang manakala alpha_num_spaces hanya membenarkan huruf, nombor (nombor 0-9) dan ruang.

Kami belum selesai dengan ini, kelas ini hanya memanjangkan kelas pengesahan Laravel. Kami masih perlu membuat Laravel mengiktirafnya supaya apabila kami menambah peraturan baru kepada perkhidmatan Vaidation kami di atas, Laravel akan tahu bagaimana untuk menjalankan pengesahan seperti peraturan tersebut.

Dokumen Laravel menyatakan bahawa kita boleh melakukan ini:

<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) {
</span>	<span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages );
</span><span>} );</span>
Salin selepas log masuk
Salin selepas log masuk

dan melekatkannya dalam apl/start/global.php atau mungkin membuat fail baru di dalam direktori aplikasi dan memuatkan fail itu dalam apl/start/global.php. Tetapi itu tidak kelihatan begitu bersih, mengubahsuai fail yang kita tidak perlu mengubah suai, melekat bit dan kepingan di sana sini. Tidak, kami lebih suka menyimpan semua kod berkaitan pengesahan ini bersama -sama, jadi kami akan membuat pembekal perkhidmatan dan melekatkan peraturan pengesahan tersuai kami ke dalam pakej pengesahan Laravel di sana.

Buat ValidationExtensionServiceProvider.php di dalam RocketCandy/Services/Validation/dan tambahkan kod berikut kepadanya:

<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Support\ServiceProvider</span>;
</span></span><span>
</span><span><span>class ValidationExtensionServiceProvider extends ServiceProvider {
</span></span><span>
</span><span>	<span>public function register() {}
</span></span><span>
</span><span>	<span>public function boot() {
</span></span><span>		<span>$this->app->validator->resolver( function( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>			<span>return new ValidatorExtended( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>		<span>} );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
Salin selepas log masuk

Jika anda telah membuat pembekal perkhidmatan di Laravel sebelum biasanya anda menggunakan kaedah daftar () untuk melakukan apa sahaja yang mengikat yang anda perlukan. Ia adalah satu -satunya kaedah abstrak dalam kelas abstrak IlluminatesupportServiceProvider yang kami telah diperluaskan di sini. Sebabnya kami tidak dapat melekatkan pelanjutan pengesahan kami dalam daftar () adalah bahawa ia dipecat sebaik sahaja penyedia perkhidmatan dimuatkan oleh Laravel dan kami akan mengalami voli pengecualian yang dilemparkan kepada kami sebagai Laravel memulakan pakej pengesahannya kemudian, jadi kami akan cuba untuk memperluaskan perkara yang tidak ada menggunakan objek yang tidak wujud. Kaedah boot () di sisi lain dipecat sebelum permintaan dialihkan, jadi kami dapat dengan selamat melekatkan barang -barang kami ke pakej pengesahan Laravel di sana.

Sekarang kita hanya perlu memberitahu Laravel untuk memuatkan penyedia perkhidmatan ini dan kita akan ditetapkan. Buka apl/config/app.php anda dan dalam array penyedia Tambahkan yang berikut pada akhir:

<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator;
</span></span><span>
</span><span><span>class ValidatorExtended extends IlluminateValidator {
</span></span><span>
</span><span>	<span>private $_custom_messages = array(
</span></span><span>		<span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.",
</span></span><span>		<span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.",
</span></span><span>	<span>);
</span></span><span>
</span><span>	<span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>		<span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>
</span><span>		<span>$this->_set_custom_stuff();
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Setup any customizations etc
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@return <span>void</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function _set_custom_stuff() {
</span></span><span>		<span>//setup our custom error messages
</span></span><span>		<span>$this->setCustomMessages( $this->_custom_messages );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, spaces and dashes (hyphens and underscores)
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaDashSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, numbers, and spaces
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaNumSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
Salin selepas log masuk
Salin selepas log masuk

Sekarang, buka aplikasi/rocketcandy/perkhidmatan/pengesahan/testFormValidator.php dan kemas kini harta peraturan $ supaya kelihatan seperti ini:

<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) {
</span>	<span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages );
</span><span>} );</span>
Salin selepas log masuk
Salin selepas log masuk

Kami menggantikan peraturan pengesahan alpha_dash untuk nama dengan alpha_dash_spaces dan alpha_num untuk pin_code dengan alpha_num_spaces.

Sekarang jika kita menavigasi ke http: // /dummy/create kita boleh memasukkan ruang dalam medan nama dan kod pin tanpa sebarang masalah dan data akan lulus pengesahan pada hantar.

Ringkasan

Jadi dalam dua bahagian tutorial ini kita belajar:

  1. Mengesahkan data di Laravel menggunakan pakej pengesahan data yang dibina.
  2. Gunakan pendekatan berorientasikan objek untuk abstrak pengesahan data untuk perkhidmatan berasingan sendiri ( Tanggungjawab tunggal Pencapaian Unlocked).
  3. Buat pengecualian tersuai kami sendiri untuk digunakan dengan perkhidmatan pengesahan data kami (bukannya menggunakan nilai boolean yang benar/palsu) dan bagaimana untuk menyimpan dan mengambil kesilapan dari mereka.
  4. Suntikan perkhidmatan pengesahan data kami di pengawal kami dan gunakannya.
  5. Memperluaskan pakej pengesahan Laravel dengan peraturan pengesahan tersuai kami dan memuatkan auto menggunakan pembekal perkhidmatan.

Nota kaki

Demi menjaga tutorial ini ke titik saya menyuntik perkhidmatan pengesahan dalam pengawal kami dan menggunakannya di sana. Dalam projek kehidupan sebenar, anda kemungkinan besar akan menggunakan perkhidmatan pengesahan di tempat lain di mana anda akan mengendalikan sanitisasi dan penyimpanan data. Sebaik -baiknya, pengawal harus bebas lemak dan mempunyai kod minimum yang minimum.


Ada pemikiran? Soalan? Api dalam komen.

Soalan Lazim mengenai Pengesahan Data Laravel dan Pengesahan Custom

Apakah faedah menggunakan Laravel untuk pengesahan data?

Laravel adalah kerangka PHP yang popular yang menawarkan sistem yang mantap dan fleksibel untuk pengesahan data. Ia menyediakan pelbagai peraturan pengesahan yang boleh digunakan dengan mudah untuk data anda, memastikan ia memenuhi piawaian yang diperlukan sebelum diproses. Sistem pengesahan Laravel juga membolehkan peraturan pengesahan tersuai, memberikan anda keupayaan untuk menentukan kriteria anda sendiri untuk pengesahan data. Ini boleh menjadi sangat berguna apabila anda perlu mengesahkan data dengan cara yang tidak dilindungi oleh peraturan pengesahan terbina dalam Laravel. anda untuk membuat peraturan pengesahan tersuai menggunakan validator :: extend method. Kaedah ini mengambil dua parameter: nama peraturan pengesahan dan penutupan yang menerima tiga argumen - nama atribut, nilai atribut, dan panggilan balik kegagalan. Di dalam penutupan, anda boleh menentukan logik untuk peraturan pengesahan tersuai anda. Sekiranya pengesahan gagal, anda harus memanggil panggilan balik kegagalan dengan mesej ralat yang sesuai.

Bolehkah saya menggunakan peraturan pengesahan terbina dalam Laravel dengan peraturan tersuai saya? Ini boleh dilakukan dengan mengikat peraturan pengesahan bersama -sama dalam logik pengesahan anda. Sebagai contoh, anda boleh menggunakan peraturan 'yang diperlukan' untuk memastikan bahawa medan tidak kosong, dan kemudian gunakan peraturan tersuai untuk mengesahkan format data.

Bagaimana saya memaparkan mesej ralat pengesahan di Laravel?

Laravel menjadikannya mudah untuk memaparkan mesej ralat pengesahan dalam pandangan anda. Apabila pengesahan gagal, Laravel mengalihkan pengguna kembali ke lokasi sebelumnya dengan semua kesilapan pengesahan yang disimpan dalam sesi. Anda kemudian boleh memaparkan kesilapan ini dalam pandangan anda menggunakan pembolehubah ralat $, yang secara automatik disediakan untuk semua pandangan oleh Laravel. Ya, Laravel membolehkan anda menyesuaikan mesej ralat untuk peraturan pengesahan tersuai anda. Ini boleh dilakukan dengan menentukan mesej tersuai anda dalam fail bahasa, dan kemudian merujuk mesej ini dalam logik pengesahan anda. Ini memberi anda fleksibiliti untuk menyesuaikan mesej ralat anda ke keperluan khusus aplikasi anda.

Bagaimana saya mengesahkan array di Laravel? Anda boleh menentukan medan array untuk disahkan dan kemudian menggunakan peraturan pengesahan kepadanya. Sebagai contoh, jika anda mempunyai pelbagai e -mel, anda boleh mengesahkan setiap e -mel dalam array menggunakan peraturan pengesahan 'e -mel'. Laravel membolehkan anda menggunakan peraturan pengesahan bersyarat. Ini bermakna anda boleh menggunakan peraturan pengesahan tertentu hanya jika syarat -syarat lain dipenuhi. Ini boleh dilakukan dengan menggunakan kaedah kadang -kadang pada contoh pengesahan.

Bagaimana saya mengesahkan muat naik fail di Laravel? imej ',' mimes ', dan' saiz '. Peraturan ini membolehkan anda mengesahkan jenis dan saiz fail yang dimuat naik, memastikan bahawa ia memenuhi keperluan aplikasi anda. peraturan pengesahan tersuai dalam permintaan borang. Ini boleh dilakukan dengan menentukan peraturan dalam kaedah peraturan kelas permintaan borang. Anda kemudian boleh menggunakan peraturan ini apabila mengesahkan data permintaan borang.

Bagaimana saya mengendalikan kegagalan pengesahan di Laravel? dengan semua kesilapan pengesahan yang disimpan dalam sesi. Anda kemudian boleh mengendalikan kesilapan ini dalam pandangan anda, memaparkannya kepada pengguna dengan cara yang sesuai untuk aplikasi anda.

Atas ialah kandungan terperinci Pengesahan Data di Laravel: Cara yang betul - Pengesahan tersuai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan