Pagination adalah ciri umum dalam aplikasi web. Hampir setiap aplikasi Laravel yang pernah saya kerjakan mempunyai beberapa bentuk penomboran yang dilaksanakan.
Tetapi apakah penomboran dan mengapa kita menggunakannya? Bagaimanakah kita dapat melaksanakan penomboran dalam aplikasi Laravel kita? Dan bagaimana kita menentukan kaedah penomboran mana yang hendak digunakan?
Dalam artikel ini, kami akan menjawab soalan -soalan yang sangat dan meneroka cara menggunakan penomboran di Laravel untuk kedua -dua pandangan bilah dan titik akhir API. Menjelang akhir artikel ini, anda harus merasa cukup yakin untuk mula menggunakan penomboran dalam projek anda sendiri.
#What adalah Pagination?
Pagination adalah teknik yang digunakan untuk membahagikan dataset besar ke dalam ketulan yang lebih kecil (atau halaman). Ia membolehkan anda memaparkan subset data, dan bukannya semua nilai yang mungkin sekaligus.
Sebagai contoh, bayangkan anda mempunyai halaman yang mengeluarkan nama semua pengguna dalam aplikasi anda. Jika anda mempunyai beribu -ribu pengguna, tidak akan praktikal untuk memaparkan semuanya pada satu halaman. Sebaliknya, anda boleh menggunakan penomboran untuk memaparkan subset pengguna (katakan 10 pengguna pada satu masa) pada setiap halaman, dan membolehkan pengguna menavigasi antara halaman untuk melihat lebih banyak pengguna (10 seterusnya).
dengan menggunakan penomboran anda boleh:
- Meningkatkan prestasi aplikasi anda - kerana anda mengambil subset data yang lebih kecil pada satu masa, terdapat kurang data untuk anda mengambil dari pangkalan data, proses/transformasi, dan kemudian kembali. Meningkatkan pengalaman pengguna - kemungkinan pengguna hanya akan berminat dengan subset kecil data pada satu masa (biasanya dijumpai dalam beberapa halaman pertama, terutama jika penapis dan istilah carian digunakan). Dengan menggunakan penomboran, anda boleh mengelakkan memaparkan data yang pengguna tidak berminat.
- Meningkatkan masa pemuatan halaman - Dengan hanya mengambil subset data pada satu masa, anda boleh mengurangkan jumlah data yang perlu dimuatkan ke halaman, yang dapat meningkatkan masa pemprosesan halaman dan pemprosesan JavaScript.
- Pagination berasaskan Offset - Ini adalah jenis penomboran yang paling biasa yang mungkin akan anda jumpai dalam aplikasi web anda, terutama dalam antara muka pengguna (UI). Ia melibatkan mengambil subset data dari pangkalan data berdasarkan "offset" dan "had". Sebagai contoh, anda mungkin mengambil 10 rekod bermula dari rekod ke -20 untuk mengambil halaman data ke -3.
- Pagination berasaskan kursor - Jenis penomboran ini melibatkan mengambil subset data berdasarkan "kursor". Kursor biasanya merupakan pengenal unik untuk rekod dalam pangkalan data. Sebagai contoh, anda mungkin akan mengambil 10 rekod seterusnya bermula dari rekod dengan ID 20.
-
paginate
- Menggunakan penomboran berasaskan offset dan mengambil jumlah rekod dalam dataset. -
simplePaginate
- Menggunakan penomboran berasaskan offset tetapi tidak mengambil jumlah rekod dalam dataset. -
cursorPaginate
- Menggunakan penomboran berasaskan kursor dan tidak mengambil jumlah rekod dalam dataset.
mari kita lihat setiap kaedah ini dengan lebih terperinci.
#menggunakan kaedah paginate
Kaedah paginate
membolehkan anda mengambil subset data dari pangkalan data berdasarkan offset dan had (kita akan melihatnya kemudian apabila kita melihat pertanyaan SQL yang mendasari).
anda boleh menggunakan kaedah paginate
seperti:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
yang menjalankan kod di atas akan menghasilkan $users
sebagai contoh IlluminateContractsPaginationLengthAwarePaginator
, biasanya objek IlluminatePaginationLengthAwarePaginator
. Contoh Paginator ini mengandungi semua maklumat yang anda perlukan untuk memaparkan data paginated dalam aplikasi anda.
Kaedah paginate
secara automatik boleh menentukan nombor halaman yang diminta berdasarkan parameter pertanyaan page
dalam URL. Sebagai contoh, jika anda melawat https://my-app.com/users?page=2
, kaedah paginate
akan mengambil halaman kedua data.
Secara lalai, semua kaedah penomboran dalam lalai Laravel untuk mengambil 15 rekod pada satu masa. Walau bagaimanapun, ini boleh ditukar kepada nilai yang berbeza (kita akan melihat bagaimana untuk melakukannya kemudian).
#using paginate
dengan pandangan bilah
mari kita lihat cara menggunakan kaedah paginate
apabila memberikan data dalam pandangan bilah.
Bayangkan kita mempunyai laluan mudah yang mengambil pengguna dari pangkalan data dalam format paginated dan menyampaikannya kepada pandangan:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
fail resources/views/users/index.blade.php
kami mungkin kelihatan seperti ini:
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>
Halaman yang dihasilkan akan kelihatan seperti ini:
mari kita pecahkan apa yang berlaku dalam pandangan bilah:
- Kami melengkung melalui setiap pengguna yang hadir di medan
$users
(objekIlluminatePaginationLengthAwarePaginator
) dan mengeluarkan nama mereka. - Kami memanggil kaedah
links
pada objek$users
. Ini adalah kaedah yang sangat berguna yang mengembalikan beberapa HTML yang memaparkan pautan penomboran (mis., "Sebelumnya", "Seterusnya", dan nombor halaman). Ini bermakna anda tidak perlu risau tentang membuat pautan penomboran sendiri, dan Laravel akan mengendalikan semua itu untuk anda.
kita juga dapat melihat bahawa kaedah paginate
memberi kita gambaran keseluruhan data penomboran. Kita dapat melihat bahawa kita melihat rekod ke -16 hingga ke -30, daripada 50 rekod. Kita juga dapat melihat bahawa kita berada di halaman kedua dan terdapat sejumlah 4 halaman.
Penting untuk diperhatikan bahawa kaedah links
akan mengembalikan gaya HTML menggunakan CSS Tailwind. Jika anda ingin menggunakan sesuatu selain daripada Tailwind atau anda ingin gaya penomboran pautan sendiri, anda boleh menyemak dokumentasi untuk menyesuaikan pandangan penomboran.
#using paginate
di titik akhir API
Serta menggunakan kaedah paginate
dalam pandangan bilah, anda juga boleh menggunakannya dalam titik akhir API. Laravel menjadikan proses ini mudah dengan menukarkan data paginat secara automatik ke JSON.
(dengan menambahkan laluan berikut ke fail /api/users
kami) yang mengembalikan pengguna paginated dalam format JSON: routes/api.php
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();Mengakses titik akhir
akan mengembalikan respons JSON yang serupa dengan yang berikut (sila ambil perhatian saya telah mengehadkan medan /api/users
kepada hanya 3 rekod demi keringkasan): data
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });mari kita memecahkan tindak balas json:
-
current_page
- Halaman semasa yang kita sedang aktif. Dalam kes ini, kami berada di halaman pertama. -
data
- Data sebenar itu sendiri yang dikembalikan. Dalam kes ini, ia mengandungi 15 pengguna pertama (dipendekkan hingga 3 untuk keringkasan). -
first_page_url
- URL ke halaman pertama data. -
from
- Nombor rekod permulaan data yang dikembalikan. Dalam kes ini, ia adalah rekod pertama. Sekiranya kami berada di halaman kedua, ini akan menjadi 16. -
last_page
- Jumlah halaman data. Dalam kes ini, terdapat 4 halaman. -
last_page_url
- URL ke halaman terakhir data. -
links
- pelbagai pautan ke halaman data yang berbeza. Ini termasuk pautan "sebelumnya" dan "seterusnya", serta nombor halaman. -
next_page_url
- URL ke halaman data seterusnya. -
path
- URL asas titik akhir. -
per_page
- Bilangan rekod yang dikembalikan setiap halaman. Dalam kes ini, ia adalah 15. -
prev_page_url
- URL ke halaman data sebelumnya. Dalam kes ini, ianull
kerana kita berada di halaman pertama. Jika kami berada di halaman kedua, ini akan menjadi URL ke halaman pertama. -
to
- Nombor rekod akhir data yang dikembalikan. Dalam kes ini, ia adalah rekod ke -15. Sekiranya kami berada di halaman kedua, ini akan menjadi 30. -
total
- Jumlah rekod dalam dataset. Dalam kes ini, terdapat 50 rekod.
#Pertanyaan SQL yang mendasari
menggunakan kaedah paginate
dalam Laravel hasil dalam dua pertanyaan SQL yang dijalankan:
- Pertanyaan pertama mengambil jumlah rekod dalam dataset. Ini digunakan untuk menentukan maklumat seperti jumlah halaman dan jumlah rekod.
- Pertanyaan kedua mengambil subset data berdasarkan nilai offset dan had. Sebagai contoh, ia mungkin mengambil pengguna untuk memproses dan kembali.
Jadi jika kita mahu mengambil halaman pertama pengguna (dengan 15 pengguna setiap halaman), pertanyaan SQL berikut akan dijalankan:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
dan
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
Dalam pertanyaan kedua, kita dapat melihat bahawa nilai limit
ditetapkan kepada 15. Ini adalah bilangan rekod yang dikembalikan setiap halaman.
nilai offset
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>jadi jika kita mahu mengambil halaman ketiga pengguna, nilai
akan dikira sebagai: offset
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('paginate', function () { return User::query()->paginate(); });akan menjadi 30 dan kami akan mengambil rekod ke -31 hingga ke -45. Pertanyaan untuk halaman ketiga akan kelihatan seperti:
offset
<!-- Syntax highlighted by torchlight.dev -->{ "current_page": 1, "data": [ { "id": 1, "name": "Andy Runolfsson", "email": "teresa.wiegand@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 2, "name": "Rafael Cummings", "email": "odessa54@example.org", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 3, "name": "Reynold Lindgren", "email": "juwan.johns@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" } ], "first_page_url": "http://example.com/users?page=1", "from": 1, "last_page": 4, "last_page_url": "http://example.com/users?page=4", "links": [ { "url": null, "label": "« Previous", "active": false }, { "url": "http://example.com/users?page=1", "label": "1", "active": true }, { "url": "http://example.com/users?page=2", "label": "2", "active": false }, { "url": "http://example.com/users?page=3", "label": "3", "active": false }, { "url": "http://example.com/users?page=4", "label": "4", "active": false }, { "url": "http://example.com/users?page=5", "label": "5", "active": false }, { "url": "http://example.com/users?page=2", "label": "Next »", "active": false } ], "next_page_url": "http://example.com/users?page=2", "path": "http://example.com/users", "per_page": 15, "prev_page_url": null, "to": 15, "total": 50 }
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
#menggunakan kaedah simplePaginate
kaedah simplePaginate
sangat serupa dengan kaedah paginate
tetapi dengan satu perbezaan utama. Kaedah simplePaginate
tidak mengambil jumlah rekod dalam dataset.
Seperti yang telah kita lihat, apabila kita menggunakan kaedah paginate
, kita juga mendapat maklumat mengenai jumlah rekod dan halaman yang terdapat dalam dataset. Kami kemudian boleh menggunakan maklumat ini untuk memaparkan perkara seperti jumlah halaman dalam respons UI atau API.
Tetapi jika anda tidak berhasrat untuk memaparkan butiran ini kepada pengguna (atau pemaju yang memakan API), maka kita boleh mengelakkan pertanyaan pangkalan data yang tidak diperlukan (yang mengira jumlah rekod) dengan menggunakan kaedah simplePaginate
.
kaedah simplePaginate
boleh digunakan dengan cara yang sama seperti paginate
kaedah:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
menjalankan kod di atas akan menghasilkan $users
sebagai contoh IlluminateContractsPaginationPaginator
, biasanya objek IlluminatePaginationPaginator
.
Tidak seperti objek IlluminatePaginationLengthAwarePaginator
yang dikembalikan oleh kaedah paginate
, objek IlluminatePaginationPaginator
tidak mengandungi maklumat mengenai jumlah rekod dalam dataset dan tidak tahu berapa banyak halaman atau jumlah rekod yang ada. Ia hanya tahu mengenai halaman data semasa dan sama ada terdapat lebih banyak rekod untuk diambil.
#using simplePaginate
dengan pandangan bilah
mari kita lihat bagaimana anda boleh menggunakan kaedah simplePaginate
dengan paparan bilah. Kami akan menganggap kami mempunyai laluan yang sama seperti sebelumnya, tetapi kali ini kami menggunakan kaedah simplePaginate
:
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>
kami akan membina pandangan bilah kami dengan cara yang sama seperti sebelumnya:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('paginate', function () { return User::query()->paginate(); });
Halaman yang dihasilkan akan kelihatan seperti ini:
Seperti yang dapat kita lihat dalam contoh ini, output $users->links()
adalah berbeza dengan output yang kita lihat ketika menggunakan kaedah paginate
. Oleh kerana kaedah simplePaginate
tidak mengambil jumlah rekod, ia tidak mempunyai konteks jumlah halaman atau rekod, hanya sama ada terdapat halaman seterusnya atau tidak. Oleh itu, kita hanya melihat pautan "sebelumnya" dan "seterusnya" dalam pautan penomboran.
#using simplePaginate
di titik akhir API
anda juga boleh menggunakan kaedah simplePaginate
dalam titik akhir API. Laravel secara automatik akan menukar data paginated ke JSON untuk anda.
mari kita membina titik akhir /api/users
yang mengembalikan pengguna paginated dalam format json:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
Apabila kita memukul laluan ini, kita akan mendapat respons JSON yang serupa dengan yang berikut (saya telah mengehadkan medan data
kepada hanya 3 rekod untuk keringkasan):
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
Seperti yang dapat kita lihat, tindak balas JSON sangat mirip dengan tindak balas yang kita dapat ketika menggunakan kaedah paginate
. Perbezaan utama ialah kita tidak mempunyai medan last_page
, last_page_url
, links
, atau total
dalam respons.
#Pertanyaan SQL yang mendasari
mari kita lihat pertanyaan SQL yang mendasari yang dijalankan semasa menggunakan kaedah simplePaginate
.
kaedah simplePaginate
masih bergantung pada nilai limit
dan offset
untuk mengambil subset data dari pangkalan data. Walau bagaimanapun, ia tidak menjalankan pertanyaan untuk mengambil jumlah rekod dalam dataset.
nilai offset
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>dikira sedikit berbeza daripada kaedah
. Ia dikira sebagai: limit
paginate
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('paginate', function () { return User::query()->paginate(); });perlu mengambil satu lagi rekod daripada nilai
untuk menentukan sama ada terdapat lebih banyak rekod untuk diambil. Sebagai contoh, katakan kami mengambil 15 rekod setiap halaman. Nilai simplePaginate
akan menjadi 16. Jadi jika 16 rekod dikembalikan, kami akan tahu terdapat sekurang -kurangnya satu lagi halaman data yang tersedia untuk diambil. Sekiranya kurang daripada 16 rekod telah dikembalikan, kami akan tahu bahawa kami berada di halaman terakhir data. perPage
limit
Jadi jika kita mahu mengambil halaman pertama pengguna (dengan 15 pengguna setiap halaman), pertanyaan SQL berikut akan dijalankan:
pertanyaan untuk halaman kedua akan kelihatan seperti:
<!-- Syntax highlighted by torchlight.dev -->{ "current_page": 1, "data": [ { "id": 1, "name": "Andy Runolfsson", "email": "teresa.wiegand@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 2, "name": "Rafael Cummings", "email": "odessa54@example.org", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 3, "name": "Reynold Lindgren", "email": "juwan.johns@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" } ], "first_page_url": "http://example.com/users?page=1", "from": 1, "last_page": 4, "last_page_url": "http://example.com/users?page=4", "links": [ { "url": null, "label": "« Previous", "active": false }, { "url": "http://example.com/users?page=1", "label": "1", "active": true }, { "url": "http://example.com/users?page=2", "label": "2", "active": false }, { "url": "http://example.com/users?page=3", "label": "3", "active": false }, { "url": "http://example.com/users?page=4", "label": "4", "active": false }, { "url": "http://example.com/users?page=5", "label": "5", "active": false }, { "url": "http://example.com/users?page=2", "label": "Next »", "active": false } ], "next_page_url": "http://example.com/users?page=2", "path": "http://example.com/users", "per_page": 15, "prev_page_url": null, "to": 15, "total": 50 }
#menggunakan kaedah
<!-- Syntax highlighted by torchlight.dev -->select count(*) as aggregate from `users`
cursorPaginate
Setakat ini kami telah melihat kaedah
dan yang kedua-duanya menggunakan penomboran berasaskan offset. Kami kini akan melihat kaedah paginate
yang menggunakan penomboran berasaskan kursor. simplePaginate
cursorPaginate
Sebagai penomboran berasaskan kursor, mungkin kelihatan sedikit mengelirukan pada kali pertama anda melihatnya. Oleh itu, jangan risau jika anda tidak dapat mendapatkannya dengan segera. Mudah -mudahan, pada akhir artikel ini, anda akan mempunyai pemahaman yang lebih baik tentang bagaimana ia berfungsi. Saya juga akan meninggalkan video yang hebat di hujung artikel ini yang menerangkan penomboran berasaskan kursor dengan lebih terperinci.
dan
untuk mengambil subset data dari pangkalan data. Jadi kita boleh mengatakan "Langkau 10 rekod pertama dan ambil 10 rekod seterusnya". Ini mudah difahami dan mudah dilaksanakan. Sedangkan dengan penomboran kursor, kami menggunakan kursor (biasanya pengenal unik untuk rekod tertentu dalam pangkalan data) sebagai titik permulaan untuk mengambil set rekod sebelumnya/seterusnya.Sebagai contoh, katakan kami membuat pertanyaan untuk mengambil 15 pengguna pertama. Kami akan menganggap ID pengguna ke -15 adalah 20. Apabila kami ingin mengambil 15 pengguna seterusnya, kami akan menggunakan ID pengguna ke -15 (20) sebagai kursor. Kami akan mengatakan "Ambil 15 pengguna seterusnya dengan ID lebih besar daripada 20".
Anda kadang -kadang boleh melihat kursor yang dirujuk sebagai "token", "kunci", "seterusnya", "sebelumnya", dan sebagainya. Mereka pada dasarnya merujuk kepada rekod tertentu dalam pangkalan data. Kami akan melihat struktur kursor kemudian dalam bahagian ini apabila kita melihat pertanyaan SQL yang mendasari.
Laravel membolehkan kita menggunakan penomboran berasaskan kursor dengan kaedah cursorPaginate
:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
yang menjalankan kod di atas akan mengakibatkan medan $users
menjadi contoh IlluminateContractsPaginationCursorPaginator
, biasanya objek IlluminatePaginationCursorPaginator
. Contoh Paginator ini mengandungi semua maklumat yang anda perlukan untuk memaparkan data paginated dalam aplikasi anda.
Sama seperti kaedah simplePaginate
, kaedah cursorPaginate
tidak mengambil jumlah rekod dalam dataset. Ia hanya mengetahui tentang halaman data semasa dan sama ada terdapat lebih banyak rekod untuk diambil, jadi kami tidak menyedari jumlah halaman atau rekod dengan segera.
#using cursorPaginate
dengan pandangan bilah
Mari kita lihat cara menggunakan kaedah cursorPaginate
apabila memberikan data dalam paparan bilah. Sama seperti contoh terdahulu kami, kami akan menganggap kami mempunyai laluan mudah yang mengambil pengguna dari pangkalan data dalam format paginated dan menyampaikannya kepada pandangan:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
pandangan bilah mungkin kelihatan seperti ini:
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>
Ini akan mengeluarkan halaman yang serupa dengan yang berikut:
Seperti yang dapat kita lihat, kerana kaedah cursorPaginate
tidak mengambil jumlah rekod dalam dataset, output $users->links()
adalah serupa dengan output yang kita lihat apabila menggunakan kaedah simplePaginate
. Kami hanya melihat pautan "sebelumnya" dan "seterusnya" dalam pautan penomboran.
#using cursorPaginate
di titik akhir API
Laravel juga membolehkan anda menggunakan kaedah cursorPaginate
dalam titik akhir API dan secara automatik akan menukar data paginated ke JSON untuk kami.
mari kita membina titik akhir /api/users
yang mengembalikan pengguna paginated dalam format json:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('paginate', function () { return User::query()->paginate(); });
Apabila kita memukul laluan ini, kita akan mendapat respons JSON yang serupa dengan yang berikut (saya telah mengehadkan medan data
kepada hanya 3 rekod untuk keringkasan):
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
Seperti yang dapat kita lihat, tindak balas JSON adalah serupa dengan respons terdahulu yang telah kita lihat tetapi dengan beberapa perbezaan kecil. Oleh kerana kita tidak mengambil jumlah rekod, kita tidak mempunyai medan last_page
, last_page_url
, links
, atau total
dalam respons. Anda juga mungkin menyedari bahawa kami tidak mempunyai medan from
dan to
sama ada.
Sebaliknya, kita mempunyai medan next_cursor
dan prev_cursor
yang mengandungi kursor untuk halaman data seterusnya dan sebelumnya. Oleh kerana kita berada di halaman pertama, medan prev_cursor
dan prev_page_url
kedua -duanya null
. Walau bagaimanapun, medan next_cursor
dan next_page_url
ditetapkan.
medan next_cursor
adalah rentetan asas-64 yang mengandungi kursor untuk halaman data seterusnya. Sekiranya kita menyahkod medan next_cursor
, kita akan mendapat sesuatu seperti ini (dicantikkan untuk kebolehbacaan):
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
kursor mengandungi dua maklumat berasingan:
-
users.id
- ID rekod terakhir yang diambil dalam dataset. -
_pointsToNextItems
- Nilai boolean yang memberitahu kami sama ada kursor menunjuk kepada set item seterusnya atau sebelumnya. Jika nilai itutrue
ia bermakna kursor harus digunakan untuk mengambil set rekod seterusnya dengan ID lebih besar daripada nilaiusers.id
. Sekiranya nilai itufalse
, ini bermakna kursor harus digunakan untuk mengambil set rekod sebelumnya dengan ID kurang daripada nilaiusers.id
.
mari kita lihat pada halaman kedua data yang kelihatan seperti (sekali lagi, dipendekkan kepada 3 rekod untuk keringkasan):
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>
kita dapat melihat bahawa medan prev_cursor
dan prev_page_url
kini ditetapkan, dan medan next_cursor
dan next_page_url
telah dikemas kini dengan kursor untuk halaman seterusnya.
Untuk mendapatkan pemahaman yang lebih baik tentang bagaimana penomboran kursor berfungsi di bawah tudung, mari kita lihat pertanyaan SQL yang mendasari yang dijalankan ketika menggunakan kaedah
.
cursorPaginate
Pada halaman pertama data (mengandungi 15 rekod), pertanyaan SQL berikut akan dijalankan:
kita dapat melihat bahawa kita mengambil 16 rekod pertama dari jadual
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('paginate', function () { return User::query()->paginate(); });dan memerintahkannya dengan lajur
dalam urutan menaik. Sama dengan kaedah users
, kami mengambil 16 baris kerana kami ingin menentukan sama ada terdapat lebih banyak rekod untuk diambil. id
simplePaginate
Bayangkan kita kemudian menavigasi ke halaman seterusnya item dengan kursor berikut:
Apabila kursor ini dimulakan, kami mendapat objek JSON berikut:
<!-- Syntax highlighted by torchlight.dev -->{ "current_page": 1, "data": [ { "id": 1, "name": "Andy Runolfsson", "email": "teresa.wiegand@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 2, "name": "Rafael Cummings", "email": "odessa54@example.org", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 3, "name": "Reynold Lindgren", "email": "juwan.johns@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" } ], "first_page_url": "http://example.com/users?page=1", "from": 1, "last_page": 4, "last_page_url": "http://example.com/users?page=4", "links": [ { "url": null, "label": "« Previous", "active": false }, { "url": "http://example.com/users?page=1", "label": "1", "active": true }, { "url": "http://example.com/users?page=2", "label": "2", "active": false }, { "url": "http://example.com/users?page=3", "label": "3", "active": false }, { "url": "http://example.com/users?page=4", "label": "4", "active": false }, { "url": "http://example.com/users?page=5", "label": "5", "active": false }, { "url": "http://example.com/users?page=2", "label": "Next »", "active": false } ], "next_page_url": "http://example.com/users?page=2", "path": "http://example.com/users", "per_page": 15, "prev_page_url": null, "to": 15, "total": 50 }
Laravel kemudian akan menjalankan pertanyaan SQL berikut untuk mengambil set rekod seterusnya:
<!-- Syntax highlighted by torchlight.dev -->select count(*) as aggregate from `users`
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
Seperti yang dapat kita lihat, kita mengambil 16 rekod seterusnya dari jadual users
yang mempunyai id
lebih besar daripada 15 (sejak 15 adalah ID terakhir pada halaman sebelumnya).
Sekarang mari kita anggap bahawa ID pengguna pertama pada halaman 2 adalah 16. Apabila kita menavigasi kembali ke halaman pertama data dari halaman kedua, kursor berikut akan digunakan:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });
Apabila ini dimulakan, kami mendapat objek JSON berikut:
<!-- Syntax highlighted by torchlight.dev --><html> <head> <title>Paginate</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body> <div class="max-w-5xl mx-auto py-8"> <h1 class="text-5xl">Paginate</h1> <ul class="py-4"> @foreach ($users as $user) <li class="py-1 border-b">{{ $user->name }}</li> @endforeach </ul> {{ $users->links() }} </div> </body> </html>
Apabila kita bergerak ke halaman seterusnya hasil, rekod terakhir yang diambil digunakan sebagai kursor. Apabila kita kembali ke halaman keputusan sebelumnya, rekod pertama diambil digunakan sebagai kursor. Atas sebab ini, kita dapat melihat nilai users.id
ditetapkan kepada 16 dalam kursor. Kita juga dapat melihat bahawa nilai _pointsToNextItems
ditetapkan ke false
kerana kita kembali ke set item sebelumnya.
Akibatnya, pertanyaan SQL berikut akan dijalankan untuk mengambil set rekod sebelumnya:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('paginate', function () { return User::query()->paginate(); });
seperti yang dapat kita lihat, kekangan where
kini memeriksa rekod dengan id
kurang daripada 16 (sejak 16 adalah ID pertama pada halaman 2) dan hasilnya diperintahkan dalam urutan menurun.
menggunakan sumber API dengan penomboran
Setakat ini, dalam contoh API kami, kami baru saja mengembalikan data paginated secara langsung dari pengawal. Walau bagaimanapun, dalam aplikasi dunia sebenar, anda mungkin mahu memproses data sebelum mengembalikannya kepada pengguna. Ini boleh jadi apa -apa daripada menambah atau mengeluarkan medan, menukar jenis data, atau bahkan mengubah data ke dalam format yang berbeza sama sekali. Atas sebab ini, anda mungkin mahu menggunakan sumber API kerana mereka menyediakan cara untuk anda secara konsisten mengubah data anda sebelum mengembalikannya.
Laravel membolehkan anda menggunakan sumber API bersama penomboran. Mari kita lihat contoh bagaimana untuk melakukan ini.
Bayangkan kami telah mencipta kelas sumber API yang mengubah data pengguna sebelum mengembalikannya. Ia mungkin kelihatan seperti ini: AppHttpResourcesUserResource
<!-- Syntax highlighted by torchlight.dev -->{ "current_page": 1, "data": [ { "id": 1, "name": "Andy Runolfsson", "email": "teresa.wiegand@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 2, "name": "Rafael Cummings", "email": "odessa54@example.org", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" }, { "id": 3, "name": "Reynold Lindgren", "email": "juwan.johns@example.net", "email_verified_at": "2024-10-15T23:19:28.000000Z", "created_at": "2024-10-15T23:19:29.000000Z", "updated_at": "2024-10-15T23:19:29.000000Z" } ], "first_page_url": "http://example.com/users?page=1", "from": 1, "last_page": 4, "last_page_url": "http://example.com/users?page=4", "links": [ { "url": null, "label": "« Previous", "active": false }, { "url": "http://example.com/users?page=1", "label": "1", "active": true }, { "url": "http://example.com/users?page=2", "label": "2", "active": false }, { "url": "http://example.com/users?page=3", "label": "3", "active": false }, { "url": "http://example.com/users?page=4", "label": "4", "active": false }, { "url": "http://example.com/users?page=5", "label": "5", "active": false }, { "url": "http://example.com/users?page=2", "label": "Next »", "active": false } ], "next_page_url": "http://example.com/users?page=2", "path": "http://example.com/users", "per_page": 15, "prev_page_url": null, "to": 15, "total": 50 }Dalam kaedah
, kami menentukan bahawa setiap kali kami memproses pengguna melalui sumber ini, kami hanya ingin mengembalikan bidang toArray
, id
, dan name
.
email
Sekarang mari kita membina titik akhir API
kami yang mengembalikan pengguna paginated menggunakan /api/users
: routes/api.php
AppHttpResourcesUserResource
<!-- Syntax highlighted by torchlight.dev -->select count(*) as aggregate from `users`(yang akan menjadi contoh
) ke kaedah $users
. Kaedah ini akan mengubah data paginated menggunakan IlluminatePaginationLengthAwarePaginator
sebelum mengembalikannya kepada pengguna. UserResource::collection
Apabila kita memukul titik akhir /api/users
, kita akan mendapat respons JSON yang serupa dengan yang berikut (saya telah mengehadkan medan data
kepada hanya 3 rekod untuk keringkasan):
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
Seperti yang dapat kita lihat di JSON di atas, Laravel mengesan bahawa kita sedang bekerja dengan dataset paginated dan mengembalikan data paginated dalam format yang sama seperti sebelumnya. Walau bagaimanapun, kali ini pengguna dalam medan data
hanya mengandungi medan id
, name
, dan email
yang kami tentukan dalam kelas sumber API kami. Bidang lain (current_page
, from
, last_page
, links
, path
, dan per_page
) masih dikembalikan kerana mereka adalah sebahagian daripada data paginated, tetapi mereka telah diletakkan di dalam medan to
. Terdapat juga medan total
yang mengandungi meta
, links
, first
, dan last
pautan ke halaman data yang berbeza. prev
next
#changing nilai per halaman
Apabila membina pandangan dengan data paginated, anda mungkin mahu membenarkan pengguna menukar bilangan rekod yang dipaparkan setiap halaman. Ini mungkin melalui medan input jatuh atau nombor.
Laravel menjadikannya mudah untuk menukar bilangan rekod yang dipaparkan setiap halaman dengan lulus parameter
ke kaedah, perPage
, dan simplePaginate
. Parameter ini membolehkan anda menentukan bilangan rekod yang ingin anda paparkan setiap halaman. paginate
cursorPaginate
mari kita lihat contoh mudah bagaimana membaca parameter pertanyaan
per_page
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('users', function () { $users = User::query()->paginate(); return view('users.index', [ 'users' => $users, ]); });. Jika nilai tidak disediakan, kami akan lalai kepada 10. Kami kemudian lulus nilai itu kepada parameter
kaedah per_page
. perPage
paginate
kita kemudian dapat mengakses URL yang berbeza ini:
- - Paparkan halaman pertama pengguna dengan 10 rekod setiap halaman.
-
https://my-app.com/users
- Paparkan halaman pertama pengguna dengan 5 rekod setiap halaman. -
https://my-app.com/users?per_page=5
- Paparkan halaman kedua pengguna dengan 5 rekod setiap halaman. -
https://my-app.com/users?per_page=5&page=2
dan sebagainya ... - #bagaimana untuk menentukan kaedah penomboran mana yang hendak digunakan
Sekarang kita telah melihat pelbagai jenis penomboran dan cara menggunakannya di Laravel, kami akan membincangkan bagaimana untuk menentukan pendekatan yang digunakan dalam aplikasi anda.
#do anda memerlukan nombor halaman atau jumlah rekod?Jika anda membina titik akhir UI atau API yang memerlukan jumlah rekod atau halaman yang akan dipaparkan, maka kaedah
mungkin merupakan pilihan yang masuk akal.
Jika anda tidak memerlukan salah satu daripada ini, maka simplePaginate
atau cursorPaginate
akan lebih efisien kerana mereka tidak melakukan pertanyaan yang tidak perlu untuk mengira jumlah rekod.
#do anda perlu melompat ke halaman tertentu?
Jika anda perlu melompat ke halaman data tertentu, maka penomboran berasaskan mengimbangi lebih sesuai. Oleh kerana penomboran kursor adalah negara, ia bergantung pada halaman sebelumnya untuk mengetahui ke mana hendak pergi seterusnya. Oleh itu, ia tidak semudah melompat ke halaman tertentu.
Manakala apabila menggunakan penomboran offset, anda biasanya boleh lulus nombor halaman dalam permintaan (mungkin sebagai parameter pertanyaan) dan melompat ke halaman itu tanpa mempunyai konteks halaman sebelumnya.
#bagaimana besar dataset?
Oleh kerana cara pangkalan data mengendalikan offset
nilai, penomboran berasaskan offset menjadi kurang efisien apabila nombor halaman meningkat. Ini kerana apabila anda menggunakan offset, pangkalan data masih perlu mengimbas semua rekod sehingga nilai offset. Mereka hanya dibuang dan tidak dikembalikan dalam hasil pertanyaan.
Inilah artikel hebat yang menerangkan ini dengan lebih terperinci: https://use-the-index-luke.com/no-offset.
Oleh kerana jumlah data dalam pangkalan data berkembang dan nombor halaman meningkat, penomboran berasaskan mengimbangi dapat menjadi kurang efisien. Dalam kes ini, penomboran berasaskan kursor lebih banyak, terutamanya jika medan kursor diindeks, kerana rekod sebelumnya tidak dibaca. Atas sebab ini, jika anda akan menggunakan penomboran terhadap dataset yang besar, anda mungkin mahu memilih penomboran kursor atas penomboran mengimbangi.
#Adakah dataset mungkin sering berubah?
penomboran berasaskan offset boleh mengalami masalah jika dataset asas berubah antara permintaan.
mari kita lihat contoh.
katakan kami mempunyai 10 pengguna berikut dalam pangkalan data kami:
- Pengguna 1
- Pengguna 2
- Pengguna 3
- Pengguna 4
- Pengguna 5
- Pengguna 6
- Pengguna 7
- Pengguna 8
- Pengguna 9
- Pengguna 10
kami membuat permintaan untuk mengambil halaman pertama (mengandungi 5 pengguna) dan dapatkan pengguna berikut:
- Pengguna 1
- Pengguna 2
- Pengguna 3
- Pengguna 4
- Pengguna 5
Apabila kami menavigasi ke halaman 2, kami mengharapkan untuk mendapatkan pengguna 6 hingga 10. Namun, bayangkan bahawa sebelum kami memuatkan halaman 2 (sementara kami masih melihat halaman 1), pengguna 1 dipadam dari pangkalan data. Oleh kerana saiz halaman adalah 5, pertanyaan untuk mengambil halaman seterusnya akan kelihatan seperti ini:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
ini bermakna kita melangkau 5 rekod pertama dan mengambil 5.
seterusnyaIni akan menghasilkan halaman 2 yang mengandungi pengguna berikut:
- Pengguna 7
- Pengguna 8
- Pengguna 9
- Pengguna 10
Seperti yang dapat kita lihat, pengguna 6 hilang dari senarai. Ini kerana pengguna 6 kini merupakan rekod ke -5 dalam jadual, jadi mereka sebenarnya berada di halaman pertama.
Pagination berasaskan kursor tidak mempunyai masalah ini, kerana kami tidak melangkau rekod, kami hanya mengambil set rekod seterusnya berdasarkan kursor. Mari kita bayangkan kami menggunakan penomboran berasaskan kursor dalam contoh di atas. Kursor untuk halaman 2 akan menjadi ID Pengguna 5 (yang akan kita anggap adalah 5) kerana ia adalah rekod terakhir pada halaman pertama. Jadi pertanyaan kami untuk halaman 2 mungkin kelihatan seperti ini:
<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate();
Menjalankan pertanyaan di atas akan mengembalikan pengguna 6 hingga 10 seperti yang diharapkan.
Ini semestinya menyerlahkan bagaimana penomboran berasaskan offset boleh menjadi bermasalah apabila data mendasar ditukar, ditambah, atau dikeluarkan semasa dibaca. Ia menjadi kurang diramalkan dan boleh menyebabkan hasil yang tidak dijangka.
#Adakah anda membina API?
Penting untuk diingat bahawa anda tidak tetap menggunakan satu jenis penomboran dalam aplikasi anda. Di sesetengah tempat, penomboran mengimbangi mungkin lebih sesuai (mungkin untuk tujuan UI) dan pada yang lain, penomboran kursor mungkin lebih cekap (seperti ketika bekerja dengan dataset yang besar). Oleh itu, anda boleh mencampur dan memadankan kaedah penomboran dalam aplikasi anda bergantung pada kes penggunaan.
anda tidak mahu mereka perlu ingat titik akhir yang menggunakan penukaran offset dan yang menggunakan paginasi kursor.
Sudah tentu, ini bukan peraturan yang keras dan cepat. Jika anda benar -benar perlu menggunakan kaedah penomboran yang berbeza dalam satu titik akhir tertentu, maka teruskan. Tetapi pastikan untuk menjelaskan dengan jelas dalam dokumentasi untuk memudahkan pemaju memahami.
#prefer video sebaliknya?
Jika anda lebih daripada seorang pelajar visual, anda mungkin ingin menyemak video hebat ini oleh Aaron Francis yang menerangkan perbezaan antara penomboran berasaskan dan kursor dengan lebih terperinci:
#conclusion
Dalam artikel ini, kami telah melihat pelbagai jenis penomboran di Laravel dan cara menggunakannya. Kami juga melihat pertanyaan SQL yang mendasari mereka dan bagaimana untuk menentukan kaedah penomboran mana yang hendak digunakan dalam permohonan anda.
Mudah -mudahan, anda kini harus merasa lebih yakin menggunakan penomboran dalam aplikasi Laravel anda.
Atas ialah kandungan terperinci Panduan untuk Penomboran di Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Untuk menggabungkan dua susunan PHP dan menyimpan nilai unik, terdapat dua kaedah utama. 1. Untuk tatasusunan indeks atau hanya deduplikasi, gunakan Array_Merge dan Array_unique Combinations: First Gabungan Array_Merge ($ array1, $ array2) dan kemudian gunakan array_unique () untuk deduplikasi mereka untuk akhirnya mendapatkan array baru yang mengandungi semua nilai unik; 2. Untuk array bersekutu dan ingin mengekalkan pasangan nilai utama dalam array pertama, gunakan pengendali: $ hasil = $ array1 $ array2, yang akan memastikan bahawa kunci dalam array pertama tidak akan ditimpa oleh array kedua. Kedua -dua kaedah ini boleh digunakan untuk senario yang berbeza, bergantung kepada sama ada nama kunci dikekalkan atau hanya fokus yang dihadapi

Untuk menentukan kekuatan kata laluan, perlu menggabungkan pemprosesan biasa dan logik. Keperluan asas termasuk: 1. Panjang tidak kurang daripada 8 digit; 2. Sekurang -kurangnya mengandungi huruf kecil, huruf besar, dan nombor; 3. Sekatan watak khas boleh ditambah; Dari segi aspek lanjutan, duplikasi berterusan aksara dan urutan tambahan/penurunan perlu dielakkan, yang memerlukan pengesanan fungsi PHP; Pada masa yang sama, senarai hitam harus diperkenalkan untuk menapis kata laluan lemah yang biasa seperti kata laluan dan 123456; Akhirnya, disyorkan untuk menggabungkan perpustakaan ZXCVBN untuk meningkatkan ketepatan penilaian.

Untuk mengendalikan muat naik fail PHP dengan selamat, anda perlu mengesahkan sumber dan jenis, mengawal nama fail dan laluan, menetapkan sekatan pelayan, dan memproses fail media dua kali. 1. Sahkan sumber muat naik untuk mengelakkan CSRF melalui token dan mengesan jenis mime sebenar melalui finfo_file menggunakan kawalan putih; 2. Namakan semula fail ke rentetan rawak dan tentukan pelanjutan untuk menyimpannya dalam direktori bukan web mengikut jenis pengesanan; 3. Konfigurasi PHP mengehadkan saiz muat naik dan direktori sementara Nginx/Apache melarang akses ke direktori muat naik; 4. Perpustakaan GD menyambung semula gambar -gambar untuk membersihkan data yang berpotensi.

Masalah dan penyelesaian biasa untuk skop pembolehubah PHP termasuk: 1. Pembolehubah global tidak dapat diakses dalam fungsi, dan ia perlu diluluskan menggunakan kata kunci atau parameter global; 2. Pembolehubah statik diisytiharkan dengan statik, dan ia hanya dimulakan sekali dan nilai dikekalkan antara pelbagai panggilan; 3. Pembolehubah hyperglobal seperti $ _get dan $ _post boleh digunakan secara langsung dalam mana -mana skop, tetapi anda perlu memberi perhatian kepada penapisan yang selamat; 4. Fungsi Anonymous perlu memperkenalkan pembolehubah skop induk melalui kata kunci penggunaan, dan apabila mengubah suai pembolehubah luaran, anda perlu lulus rujukan. Menguasai peraturan ini boleh membantu mengelakkan kesilapan dan meningkatkan kestabilan kod.

Terdapat tiga kaedah umum untuk kod komen PHP: 1. Use // atau # untuk menyekat satu baris kod, dan disyorkan untuk menggunakan //; 2. Gunakan /.../ untuk membungkus blok kod dengan pelbagai baris, yang tidak boleh bersarang tetapi boleh diseberang; 3. Komen -komen kemahiran gabungan seperti menggunakan / jika () {} / untuk mengawal blok logik, atau untuk meningkatkan kecekapan dengan kunci pintasan editor, anda harus memberi perhatian kepada simbol penutupan dan mengelakkan bersarang apabila menggunakannya.

Kunci untuk menulis komen PHP adalah untuk menjelaskan tujuan dan spesifikasi. Komen harus menjelaskan "mengapa" dan bukannya "apa yang dilakukan", mengelakkan redundansi atau terlalu kesederhanaan. 1. Gunakan format bersatu, seperti docblock (/*/) untuk deskripsi kelas dan kaedah untuk meningkatkan keserasian dan keserasian alat; 2. Menekankan sebab -sebab di sebalik logik, seperti mengapa JS melompat perlu dikeluarkan secara manual; 3. Tambahkan gambaran keseluruhan gambaran sebelum kod kompleks, terangkan proses dalam langkah -langkah, dan membantu memahami idea keseluruhan; 4. Gunakan Todo dan Fixme secara rasional untuk menandakan item dan masalah untuk memudahkan penjejakan dan kerjasama berikutnya. Anotasi yang baik dapat mengurangkan kos komunikasi dan meningkatkan kecekapan penyelenggaraan kod.

Ageneratorinphpisamemory-efficientwaytoiterateOverlargedatasetsbyieldingvaluesonateatimeNsteadofreturningthemallatonce.1.GeneratorSuseTheyEldeyWorderWorderToProducevaluuesondemand,

Terdapat dua cara untuk membuat array dalam PHP: Gunakan fungsi array () atau gunakan kurungan []. 1. Menggunakan fungsi array () adalah cara tradisional, dengan keserasian yang baik. Tentukan array indeks seperti $ buah -buahan = array ("epal", "pisang", "oren"), dan array bersekutu seperti $ user = array ("name" => "John", "umur" => 25); 2. Menggunakan [] adalah cara yang lebih mudah untuk menyokong sejak Php5.4, seperti warna $
