laravelモデルバインディング失敗の原因と解決策を解説した記事

PHPz
リリース: 2023-04-08 23:30:02
オリジナル
962 人が閲覧しました

Laravel モデル バインディングは、Laravel フレームワークの重要な機能であり、コントローラー メソッドで指定されたモデルに URL パラメーターを自動的に挿入する機能を提供し、開発者がデータベースを手動でクエリするという面倒なプロセスを回避します。ただし、実際には、開発者はモデル バインディングの失敗に遭遇し、プログラム例外が発生することがあります。この記事では、実際のケースから始めて、Laravel モデル バインディングで考えられる問題とその解決策を説明します。

例:

製品リスト ページがあるとします。URL は製品カテゴリを表すカテゴリ パラメータを受け取ります。コントローラはモデル バインディングを使用して、指定されたカテゴリにある製品をクエリし、ビュー。次のコードを通じて実装します。

public function index(Category $category)
{
    $products = $category->products;
    return view('products.index', ['products' => $products]);
}
ログイン後にコピー

ご覧のとおり、index() のパラメータ $category を通じて Category モデルをバインドします。 メソッドを実行し、このカテゴリのすべての製品を取得します。ただし、ブラウザのアドレス バーに存在しないカテゴリを入力すると、プログラムは以下に示すように例外をスローします。

Illuminate\Database\Eloquent\ModelNotFoundException

No query results for model [App\Category].
ログイン後にコピー

プログラムによってスローされた例外情報は ModelNotFoundException # であることがわかりました。 ##、これは、Laravel フレームワークが対応するモデルを見つけることができないことを意味します。では、この問題の原因は何でしょうか?

問題の原因:

モデル バインディングが適切に機能するための前提は、URL パラメーターがデータベース内の対応するモデルと一致する必要があることです。 URL パラメーターが一致しない場合、モデル バインディングは失敗します。上の例では、存在しないカテゴリ ID をアドレス バーに入力したため、プログラムは対応するモデルを見つけることができませんでした。

さらに、コントローラー メソッドにモデルを手動で挿入する場合 (例:

public function show(Product $product)
{
    return view('products.show', ['product' => $product]);
}
ログイン後にコピー
)、次の問題にも注意する必要があります。

    パラメータ名はルートと同じである必要があります。 のプレースホルダ名は同じです。
  1. パラメータのタイプは Eloquent モデル クラスである必要があります。
  2. 対応するモデルが見つからない場合、
  3. ModelNotFoundException 例外がスローされます。
解決策:

それでは、モデル バインディングの失敗の問題をどのように解決すればよいでしょうか?以下に 2 つの解決策を示します。

    グローバル スコープ パーサーを定義する
すべての

ModelNotFoundException# をキャプチャするために、boot() メソッドでグローバル スコープ パーサーを定義できます。 ## 例外を作成し、それをカスタム例外に変換します。実装方法は次のとおりです。 (1) カスタム例外を定義します。

namespace App\Exceptions;

use Exception;

class NotFoundException extends Exception
{
    public function render($request)
    {
        return response()->view('errors.404');
    }
}
ログイン後にコピー

この例外クラスが例外をスローすると、

resources/views/errors/404 が返されます。ブレード。php

ビュー。 (2)

AppServiceProvider.php

にパーサーを登録します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">use App\Exceptions\NotFoundException; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider {     public function boot()     {         $this-&gt;app-&gt;bind(ModelNotFoundException::class, function ($e) {             throw new NotFoundException;         });     } }</pre><div class="contentsignin">ログイン後にコピー</div></div>

boot()

メソッドで、 ModelNotFoundException# をバインドします。 ## プログラムが 404 ページを正しくレンダリングできるようにするためのカスタム例外 NotFoundException の例外。 手動で例外をスローする

  1. コントローラー メソッドでは、カスタム例外を手動でスローできます。例:
  2. public function show($id)
    {
        $product = Product::findOrFail($id);
    
        if ($product->category->id !== $this->category->id) {
            throw new NotFoundException;
        }
    
        return view('products.show', ['product' => $product]);
    }
    ログイン後にコピー
このメソッドでは、手動で例外をスローします。製品モデルをクエリし、カテゴリ ID に基づいて製品が現在のカテゴリに属しているかどうかを判断します。属していない場合は、手動でカスタム例外

NotFoundException

をスローします。

結論:

Laravel モデル バインディングは Laravel フレームワークの重要な機能であり、データベース クエリとコントローラー コードを大幅に簡素化できます。ただし、実際には、存在しないモデルの手動挿入の回避、例外を処理するグローバル パーサーの定義など、いくつかの詳細にも注意を払う必要があります。この記事を通じて、皆さんが Laravel モデル バインディングをより深く理解し、不要な問題を回避できることを願っています。

以上がlaravelモデルバインディング失敗の原因と解決策を解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!