Laravel 8:如何使隐式模型绑定路由参数可选而不是抛出 404?
Posted
技术标签:
【中文标题】Laravel 8:如何使隐式模型绑定路由参数可选而不是抛出 404?【英文标题】:Laravel 8: How can I make an implicitly model bound route parameter optional instead of throwing 404? 【发布时间】:2021-02-05 02:50:26 【问题描述】:我尝试将 implicit binding 和 optional parameters 上的 Laravel 文档结合起来,并具有以下代码。
路由文件:
Route::get('go/example?', [ExampleController::class, 'click'])->name('example');
在控制器中:
public function click(Example $example = null)
// Execution never reaches here
除非有一个带有正确 slug 的示例,否则执行永远不会到达控制器,因为它会引发 404。我想检查控制器中的 $example
是否为空,并在那里使用自定义逻辑。这如何实现?
【问题讨论】:
【参考方案1】:试试这个
Route::get('go/example?', [ExampleController::class, 'click'])->name('example');
public function click($example)
if($example != null)
$example = Example::findOrfail($example);
在模型绑定中,它会自动运行 findOrfail
到该模型,所以不要这样,这样你就可以控制它,然后你就可以管理了
【讨论】:
这行得通。我希望保留类型提示和路由模型绑定。你是说没有办法将 Laravel 配置为 find 而不是 findOrFail? @Menasheh 是的,因为默认情况下 Laravel 在模型绑定中使用findOrFail
@Menasheh 是的,您可以通过明确声明自己的模型绑定来覆盖 findOrFail,请参阅此链接:laravel.com/docs/8.x/routing#customizing-the-resolution-logic【参考方案2】:
为此,您需要使用 'id' 作为数据库和模型中的主键,
如果您为您的主键使用另一个名称,那么您需要在您的路由中定义它:
Route::get('go/example:number?', [...]);
【讨论】:
这有什么帮助?以上是关于Laravel 8:如何使隐式模型绑定路由参数可选而不是抛出 404?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定
在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型