路由隐式绑定 ,使用依赖注入 如果在数据库中找不到对应的模型实例,将会自动生成 404 异常。 如何自定义这个异常

Laravel 会自动处理定义在路由或控制器行为中,与类型提示的变量名相匹配的路由段名称的 Eloquent 模型,例如:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

在这个例子中,由于 $user 变量被类型提示为 Eloquent 模型 App\User,变量名称又与 URI 中的 {user} 匹配,因此,Laravel 会自动注入与请求 URI 中传入的 ID 匹配的用户模型实例。如果在数据库中找不到对应的模型实例,将会自动生成 404 异常。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

路由隐式绑定是 Kernel.php 中 middleware 中的 SubstituteBindings::class,这个中间件抛出 ModelNotFoundException,然后被内置的 Exception Handler 的 render 方法捕获,然后返回 404 响应。想修改默认的捕获,可以在 app/Exceptions/Handler.php 的 render 方法中先于 parent::render 捕获返回 response 就行,比如:

public function render($request, Exception $exception)
{
        if ($exception instanceof ModelNotFoundException) {
            // ..
        }

        return parent::render($request, $exception);
}

见文档 Render 方法
也可以自定义一个 Exception,把 ModelNotFoundException 转成自定义 Exception 也行

if ($exception instanceof ModelNotFoundException) {
    $exception = new CustomException($exception->getMessage(), $exception);
}

自定义 Exception 需继承 Exception 类,并实现 __construct 和 render 两个方法,然后 laravel 会调用 render 方法

8个月前 评论
讨论数量: 2

路由隐式绑定是 Kernel.php 中 middleware 中的 SubstituteBindings::class,这个中间件抛出 ModelNotFoundException,然后被内置的 Exception Handler 的 render 方法捕获,然后返回 404 响应。想修改默认的捕获,可以在 app/Exceptions/Handler.php 的 render 方法中先于 parent::render 捕获返回 response 就行,比如:

public function render($request, Exception $exception)
{
        if ($exception instanceof ModelNotFoundException) {
            // ..
        }

        return parent::render($request, $exception);
}

见文档 Render 方法
也可以自定义一个 Exception,把 ModelNotFoundException 转成自定义 Exception 也行

if ($exception instanceof ModelNotFoundException) {
    $exception = new CustomException($exception->getMessage(), $exception);
}

自定义 Exception 需继承 Exception 类,并实现 __construct 和 render 两个方法,然后 laravel 会调用 render 方法

8个月前 评论

你想怎么自定义? app/Exceptions/Handler.php

public function register(): void
    {
        $this->reportable(function (Throwable $e) {
            if($e instanceof ModelNotFoundException)
            {
                // TODO 模型 404
            }
        });
    }
8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!