Rumah >rangka kerja php >Laravel >Artikel yang menerangkan sebab dan penyelesaian kegagalan pengikatan model laravel

Artikel yang menerangkan sebab dan penyelesaian kegagalan pengikatan model laravel

PHPz
PHPzasal
2023-04-08 23:30:021026semak imbas

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:

  1. Nama parameter mestilah Sama dengan nama pemegang tempat dalam laluan.
  2. Jenis parameter mestilah kelas model Eloquent.
  3. Jika model yang sepadan tidak ditemui, pengecualian ModelNotFoundException akan dilemparkan.

Penyelesaian:

Jadi, bagaimana kita hendak menyelesaikan masalah kegagalan pengikatan model? Di bawah adalah dua penyelesaian.

  1. Tentukan penghurai skop global

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.

  1. Melempar pengecualian secara manual

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!

Kenyataan:
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