路由隐式绑定 ,使用依赖注入 如果在数据库中找不到对应的模型实例,将会自动生成 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 异常。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

路由隐式绑定是 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

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

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

路由隐式绑定是 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个月前 评论

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