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 フレームワークが対応するモデルを見つけることができないことを意味します。では、この問題の原因は何でしょうか?
public function show(Product $product) { return view('products.show', ['product' => $product]); }
例外がスローされます。
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)
にパーサーを登録します。 <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->app->bind(ModelNotFoundException::class, function ($e) {
throw new NotFoundException;
});
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
メソッドで、 ModelNotFoundException# をバインドします。 ## プログラムが 404 ページを正しくレンダリングできるようにするためのカスタム例外
NotFoundException の例外。
手動で例外をスローする
public function show($id) { $product = Product::findOrFail($id); if ($product->category->id !== $this->category->id) { throw new NotFoundException; } return view('products.show', ['product' => $product]); }
NotFoundException
をスローします。結論:
以上がlaravelモデルバインディング失敗の原因と解決策を解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。