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 的隐式路由模型绑定

laravel 路由模型绑定

在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型

Laravel 4:如何传递多个可选参数

php中laravel框架的控制器如何获取路由传过来的可选参数?

如何将参数传递给 Laravel 5 中的隐式控制器?