Pengikatan model Laravel ialah ciri penting rangka kerja Laravel Ia menyediakan fungsi untuk menyuntik parameter URL secara automatik ke dalam model yang ditentukan dalam kaedah pengawal, mengelakkan proses membosankan untuk menyoal pangkalan data secara manual oleh pembangun. Walau bagaimanapun, dalam amalan, pembangun kadangkala menghadapi kegagalan pengikatan model, menyebabkan pengecualian program. Artikel ini akan bermula dengan kes sebenar untuk menerangkan kemungkinan masalah dan penyelesaian kepada pengikatan model Laravel.
Contoh:
Andaikan kami mempunyai halaman senarai produk URL menerima parameter kategori untuk mewakili kategori produk Pengawal menggunakan pengikatan model untuk menanyakan produk di bawah kategori yang ditentukan pandangan. Kami melaksanakan ini melalui kod berikut:
public function index(Category $category) { $products = $category->products; return view('products.index', ['products' => $products]); }
Seperti yang anda lihat, kami mengikat model index()
melalui parameter $category
kaedah Category
, dan kemudian mendapatkan semua produk di bawah kategori ini . Walau bagaimanapun, apabila kami memasukkan kategori yang tidak wujud dalam bar alamat penyemak imbas, program akan membuang pengecualian, seperti yang ditunjukkan di bawah:
Illuminate\Database\Eloquent\ModelNotFoundException No query results for model [App\Category].
Kami mendapati bahawa maklumat pengecualian yang dilemparkan oleh atur cara ialah ModelNotFoundException
, yang bermaksud bahawa rangka kerja Laravel tidak dapat mencari model yang sepadan. Jadi, apakah punca masalah ini?
Punca masalah:
Untuk pengikatan model berfungsi dengan betul, parameter URL mesti sepadan dengan model yang sepadan dalam pangkalan data. Jika parameter URL tidak dapat dipadankan, pengikatan model akan gagal. Dalam contoh di atas, kami memasukkan ID kategori yang tidak wujud dalam bar alamat, yang menyebabkan program tidak dapat mencari model yang sepadan.
Selain itu, jika kami menyuntik model secara manual dalam kaedah pengawal, contohnya:
public function show(Product $product) { return view('products.show', ['product' => $product]); }
, anda juga perlu memberi perhatian kepada isu berikut:
ModelNotFoundException
akan dilemparkan. Penyelesaian:
Jadi, bagaimana kita hendak menyelesaikan masalah kegagalan pengikatan model? Di bawah adalah dua penyelesaian.
Kita boleh mentakrifkan penghurai skop global dalam kaedah boot()
untuk menangkap semua ModelNotFoundException
pengecualian dan kemudian Tukarkannya kepada tersuai pengecualian. Berikut ialah kaedah pelaksanaan:
(1) Tentukan pengecualian tersuai:
namespace App\Exceptions; use Exception; class NotFoundException extends Exception { public function render($request) { return response()->view('errors.404'); } }
Apabila kelas pengecualian ini membuang pengecualian, ia akan mengembalikan paparan resources/views/errors/404.blade.php
.
(2) Daftarkan penghurai dalam AppServiceProvider.php
:
use App\Exceptions\NotFoundException; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { $this->app->bind(ModelNotFoundException::class, function ($e) { throw new NotFoundException; }); } }
Dalam kaedah boot()
, kami mengikat ModelNotFoundException
pengecualian kepada pengecualian tersuai NotFoundException
, Supaya program ini boleh memaparkan halaman 404 dengan betul.
Dalam kaedah pengawal, kita boleh membuang pengecualian tersuai secara manual, contohnya:
public function show($id) { $product = Product::findOrFail($id); if ($product->category->id !== $this->category->id) { throw new NotFoundException; } return view('products.show', ['product' => $product]); }
Dalam kaedah Dalam ini , kami menanya model produk secara manual, dan kemudian menentukan sama ada produk itu tergolong dalam kategori semasa berdasarkan ID kategori Jika tidak, kami membuang pengecualian tersuai secara manual NotFoundException
.
Kesimpulan:
Pengikatan model Laravel ialah ciri penting dalam rangka kerja Laravel, yang boleh memudahkan pertanyaan pangkalan data dan kod pengawal. Walau bagaimanapun, dalam amalan, kita juga perlu memberi perhatian kepada beberapa butiran, seperti mengelakkan menyuntik model yang tidak wujud secara manual, menentukan penghurai global untuk mengendalikan pengecualian, dsb. Saya berharap melalui artikel ini, semua orang dapat lebih memahami pengikatan model Laravel dan mengelakkan masalah yang tidak perlu.
Atas ialah kandungan terperinci Artikel yang menerangkan sebab dan penyelesaian kegagalan pengikatan model laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!