一文介绍Laravel Ignition的一切

                                                                               

在这篇博客文章中,我将告诉你关于 ignition 的一切。

让我们看看默认情况下 PHP 中有什么。在不使用框架的情况下,PHP 提供了这个功能。您只会得到错误:没有堆栈跟踪、没有请求或应用程序详情。
PHP 错误

Symfony 的错误页面稍微好一些,它向您显示堆栈跟踪,但是没有多大帮助。

Symfony 错误

下面的截图是 Whoops,这是 Laravel 5 中的标准。它比默认的 Symfony 好得多,可以显示堆栈跟踪和一些关于请求的信息。尽管在 Laravel 中 Whoops 是默认值,但它是一个框架无关的(错误收集展示)。它仅仅显示通用信息。

Whoops 错误

这是 Ignition 的截图,我们建立的新的错误视图。因为这是 Laravel 特有的,我们可以做很多很酷的事情。

Ignition 错误

发现 Ignition

让我们来探索 Ignition 所有的细节。它是开源的,您可以在这里查看代码(https://github.com/facade/ignition)。

如果视图中有错误,这就是 whoops 显示它们的方式。注意,异常消息不适合分配的空间。你必须(鼠标)悬停在它上面才能看完整(信息)。在堆栈跟踪中,您可以看到使用了编译后的 Blade 视图和内容。这使得跟踪哪个 Blade 视图文件包含错误变得困难,并且视图内容本身是不可读的。

Whoops 视图错误

Ignition是一个 Laravel 特定的错误页面。因此,它可以像钩子一样,”挂载”到框架中, 用来显示未编译的视图路径和您的 Blade 视图。顶部还有足够的空间显示整个异常页面,不需要额外的单击。我们也只在默认情况下显示应用程序帧,因为这些可能是您感兴趣的帧。

Ignition 视图错误

如果您单击 stack trace 选项卡右侧文件名旁边的铅笔图标,我们将在您喜欢的编辑器中自动打开该文件。默认情况下是 PhpStorm 。您可以在 ignition 配置文件中将其配置为您最喜欢的编辑器。

注意到右上角的那个小“望远镜”链接了吗?我们只会在您安装了Laravel Telescope(第一方调试助手)的情况下显示。如果你点击那个链接,你将被带到望远镜内发生错误的异常。

黑暗模式

如果我们默认的错误屏幕太亮了,你会很高兴知道我们的错误页面也有一个黑暗模式。

Dark mode

Ignition 选项卡

让我们探索一下 Ignition 页面上显示的选项卡。

「请求」选项卡

Request tab

在「堆栈跟踪」选项卡旁边,您将看到「请求」选项卡。它显示了您对请求的所有预期信息。

假设你有一个路由定义是这样的::

Route::get('/posts/{post}', function (Post $post) {    //});

当此路由发生异常,我们将在 Ignition 中打印 路由参数 post 模型($post 变量),以转化后数组(toArray )形式呈现。对于不需要任何绑定的“简单”路由参数也是如此。这是一个很好的方法,可以很容易地看到 Laravel 为这个特定的路由接收了什么信息。

在路由参数之后,我们还将向您显示在此请求中使用的中间件列表。

接下来是“视图”部分。如果异常发生在视图中,我们将在这里显示视图名称。甚至:我们还将给出传递给视图的所有数据的列表。

用户选项卡

User tab

“用户” 选项卡包含有使用应用程序的用户和浏览器的更多信息。

上下文选项卡

上下文选项卡

Context  选项卡中,我们显示关于您的  repo  (repo位于何处,签出提交hash)和环境(您使用的 PHP 和 Laravel 的哪个版本)的信息。

调试选项卡

调试选项卡

Debug 选项卡中,我们将显示异常发生之前发生的事情。比如查询、日志和转储。在转储旁边,我们还显示您将 dump 语句放在何处的文件名。单击铅笔图标,您就可以直接访问该文件,并在您最喜欢的编辑器中纠正行号。

建议的解决方案

让我们来看一下另一个错误。这次我们将忘记导入 Class。Ignition 报错页面是这样的。

所以,Ignition 在看到异常是关于一个没有找到的 Class 时。它将尝试找出在其他命名空间中是否存在这个 Class。如果存在的话,它会建议我们导入。
Missing import solution

文心一言 文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

文心一言 1008 查看详情 文心一言

Ignition 自带一系列常见问题的解决方案。若没有找到Blade视图,会采用一个无效视图如下所示。

无效视图

您还可以自定义异常解决方案。需要异常类实现FacadeIgnitionContractsProvidesSolutions 接口。它要求您添加一个getSolution 方法。下面是一个可能的实现。

namespace AppExceptions;use Exception;use FacadeIgnitionContractsSolution;use FacadeIgnitionContractsBaseSolution;use FacadeIgnitionContractsProvidesSolution;class CustomException extends Exception implements ProvidesSolution{    public function getSolution(): Solution    {          return BaseSolution::create("You're doing it wrong")            ->setSolutionDescription('You are obviously doing something wrong. Check your code and try again.')            ->setDocumentationLinks([                'Laracasts' => 'https://laracasts.com',                'Use Flare' => 'https://flareapp.io',            ]);    }}

下面是在 Ignition 中抛出异常的样子。

自定义解决方案

运行解决方案

除了仅仅是建议的解决方案,我们也可以运行它们。想象一下,例如,您忘记设置app key。这是用 Ignition 展示错误的样子。

App key 丢失

如果你点击“生成app key”按钮,我们会在后台生成并设置app key

App key 生成

刷新页面后,应用程序将正常工作(除非它含有其他异常)

您可以通过让异常实现 FacadeIgnitionContractsProvidesSolution 来创建可运行的解决方案,这与不可运行的解决方案非常相似)。getSolution 方法既可以返回可运行的解决方案,也可以返回不可运行的解决方案。

namespace AppExceptions;use Exception;use FacadeIgnitionContractsProvidesSolution;class CustomException extends Exception implements ProvidesSolution{    public function getSolution(): Solution    {          return new MyRunnableSolution();    }}

下面是实现类MyRunnableSolution.示例

namespace AppSolutions;use FacadeIgnitionContractsRunnableSolution;class MyRunnableSolution implements RunnableSolution{    public function getSolutionTitle(): string    {        return 'You are doing it wrong';    }    public function getSolutionDescription(): string    {        return 'You are doing something wrong, but we can fix it for you.';    }    public function getDocumentationLinks(): array    {        return [];    }    public function getSolutionActionDescription(): string    {        return 'To fix this issue, all you need to do is press the button below.';    }    public function getRunButtonText(): string    {        return 'Fix this for me';    }    public function run(array $parameters = [])    {        // Your solution implementation    }    public function getRunParameters(): array    {        return [];    }}

以下是在 Ignition 中 如何抛出自定义异常 CustomException 的样子.

自定义可运行解决方案

当用户点击Fix this for me修复按钮时,run 函数将执行。

您可以将参数从异常发生的请求传递到将运行解决方案的请求。让getRunParameters 返回一个数组。该数组将被传递给 run

使 Ignition 更聪明

因此,你有能力使用文本或者可运行的解决方案来增强自己的异常。 但有时需要为内置的 PHP 异常,甚至是你无法控制代码的第三方异常提供友好的解决方案。

我们允许你使用 “Solution Providers” 来处理上面提到的难点。 Solution Providers 是可以通过 Ignition 挂钩到解决方案查找过程的类。 当异常被抛出并且 Ignition 接收到异常时,你可以调用自定义 solution provider 为这个异常返回一个或多个可能的解决方案。

例如,您可以创建一个自定义“堆栈溢出”解决方案提供程序,它将尝试为给定的异常找到匹配的堆栈溢出结果,并将它们作为解决方案返回。

我们也在 Ignition 自身上使用解决方案提供者。下面是这样一个解决方案提供者的样子:

use Throwable;use RuntimeException;use FacadeIgnitionContractsSolution;use FacadeIgnitionSolutionsGenerateAppKeySolution;use FacadeIgnitionContractsHasSolutionForThrowable;class MissingAppKeySolutionProvider implements HasSolutionForThrowable{    public function canSolve(Throwable $throwable): bool    {        if (! $throwable instanceof RuntimeException) {            return false;        }        return $throwable->getMessage() === 'No application encryption key has been specified.';    }    public function getSolutions(Throwable $throwable): array    {        return [            new GenerateAppKeySolution()        ];    }}

这些解决方案提供者可以在Ignition中自动注册,如下所示:

namespace AppProviders;use AppSolutionsGenerateAppKeySolution;use FacadeIgnitionContractsSolutionProviderRepository;use IlluminateSupportServiceProvider;class YourServiceProvider extends ServiceProvider{    /**     * Register services.     *     * [@return](https://learnku.com/users/31554) void     */    public function register(SolutionProviderRepository $solutionProviderRepository)    {        $solutionProviderRepository->registerSolutionProvider(GenerateAppKeySolution::class);    }}

就像这样,方案提供者将继续增强 Ignitions 功能,为您的异常提供解决方案,我们迫不及待地想看看社区将提供什么!

定制 Ignition

Ignition 具有可扩展性。您可以添加新选项卡或替换默认选项卡。

让我们看一下提供的 facade/ignition-tinker-tab。 该包是一个基于 spatie/laravel-web-tinker的包装器,它允许您在浏览器中使用Artisan tinker

安装了 facade/ignition-tinker-tab,您就可以在错误页面上使用Artisan tinker

Tinker 选项卡

我们还创建了第二个包, 名为 facade/ignition-code-editor。这个选项卡替换了默认的stack trace选项卡,使用一个自定义选项卡,允许您在错误屏幕上编辑代码。它就在如下操作。

Laravel

想学习如何添加自定义选项卡, 请访问 the documentation on adding tabs.

相关推荐:最新的五个Laravel视频教程

原文地址:https://freek.dev/1441-ignition-a-new-error-page-for-laravel

译文地址:https://learnku.com/laravel/t/33857

以上就是一文介绍Laravel Ignition的一切的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/482362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 12:01:11
下一篇 2025年11月8日 12:07:13

相关推荐

  • HTMLrev 上的免费 HTML 网站模板

    HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

    2025年12月24日
    300
  • 如何使用 Laravel 框架轻松整合微信支付与支付宝支付?

    如何通过 laravel 框架整合微信支付与支付宝支付 在 laravel 开发中,为电商网站或应用程序整合支付网关至关重要。其中,微信支付和支付宝是中国最流行的支付平台。本文将介绍如何使用 laravel 框架封装这两大支付平台。 一个简单有效的方法是使用业内认可的 easywechat lara…

    2025年12月24日
    000
  • Laravel 框架中如何无缝集成微信支付和支付宝支付?

    laravel 框架中微信支付和支付宝支付的封装 如何将微信支付和支付宝支付无缝集成到 laravel 框架中? 建议解决方案 考虑使用 easywechat 的 laravel 版本。easywechat 是一个成熟、维护良好的库,由腾讯官方人员开发,专为处理微信相关功能而设计。其 laravel…

    2025年12月24日
    500
  • 如何在 Laravel 框架中轻松集成微信支付和支付宝支付?

    如何用 laravel 框架集成微信支付和支付宝支付 问题:如何在 laravel 框架中集成微信支付和支付宝支付? 回答: 建议使用 easywechat 的 laravel 版,easywechat 是一个由腾讯工程师开发的高质量微信开放平台 sdk,已被广泛地应用于许多 laravel 项目中…

    2025年12月24日
    000
  • 使用Laravel框架如何整合微信支付和支付宝支付?

    使用 Laravel 框架整合微信支付和支付宝支付 在使用 Laravel 框架开发项目时,整合支付网关是常见的需求。对于微信支付和支付宝支付,推荐采用以下方法: 使用第三方库:EasyWeChat 的 Laravel 版本 建议直接使用现有的 EasyWeChat 的 Laravel 版本。该库由…

    2025年12月24日
    000
  • 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中?

    如何简洁集成微信和支付宝支付到 Laravel 问题: 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中? 答案: 强烈推荐使用流行的 Laravel 包 EasyWeChat,它由腾讯开发者维护。多年来,它一直保持更新,提供了一个稳定可靠的解决方案。 集成步骤: 安装 Laravel …

    2025年12月24日
    100
  • Web页面中动态内容与页脚重叠的解决方案

    本教程旨在解决使用php `include`功能构建bootstrap网站时,页脚内容与主体内容重叠的问题。核心在于纠正html结构中的多余 “ 和 ` ` 标签,确保每个页面只包含一个完整的html文档结构,并将javascript脚本正确放置在 “ 结束标签之前,从而实现…

    2025年12月23日
    000
  • Laravel Blade模板中DIV元素样式定制指南:字体、间距与最佳实践

    本教程详细介绍了如何在laravel blade模板中为div元素应用自定义字体、调整大小和设置间距。我们将探讨常见的错误、正确的内联样式方法,并强调使用css类的最佳实践,同时指导如何正确集成自定义字体,以实现清晰、可维护的样式控制。 引言:理解Blade模板中的样式需求 在构建Web应用时,我们…

    2025年12月23日
    200
  • 如何正确构建HTML结构以确保Bootstrap页脚自动下沉

    本教程旨在解决使用php `include` 和 bootstrap 5 时页脚与内容重叠的问题。核心在于纠正不正确的html结构,避免重复的“和` `标签,合理放置css和javascript引用,并移除可能导致布局冲突的`vh-100`类,确保页脚能根据内容动态下沉。 在Web开发中…

    2025年12月23日
    000
  • 优化Web页面布局:确保Bootstrap页脚自动适应内容高度

    当使用php `include` 动态构建页面时,不正确的html结构(如重复的 “ 和 ` ` 标签)常导致页脚与主体内容重叠。本文将指导如何通过修正html文档结构,避免冗余标签,并确保javascript脚本正确放置,从而实现页脚自动向下移动,适应动态内容高度,提升页面布局的稳定性…

    2025年12月23日
    000
  • PHP Include与Bootstrap布局:解决动态内容下的页脚重叠问题

    本文探讨了在使用php `include` 和 bootstrap 构建网页时,因不当的html结构和css应用导致的页脚重叠问题。教程将指导您如何通过规范html文档结构、正确放置脚本文件以及移除冲突的css属性,确保页脚能够随主体内容动态调整位置,实现健壮且响应式的页面布局。 问题分析:页脚重叠…

    2025年12月23日
    000
  • 怎么运行.html.tpl_运行.html.tpl文件步骤【指南】

    .html.tpl文件需通过后端模板引擎解析,不能直接运行;首先搭建PHP环境,安装Smarty等模板引擎,配置模板与编译目录,编写PHP脚本加载.tpl文件并分配数据,最后通过访问PHP文件触发渲染,浏览器查看最终HTML。 运行 `.html.tpl` 文件并不是直接像普通 HTML 文件那样在…

    2025年12月23日
    000
  • 解决PHP Include页面中页脚重叠问题的最佳实践

    本文旨在解决使用PHP `include`功能构建网页时,页脚与主体内容重叠的问题。核心在于纠正不规范的HTML结构,确保每个页面只有一个`html>`和` `标签,并合理组织导航、内容和页脚的PHP包含文件,同时优化脚本加载位置和元素间距,以实现稳固且响应式的页面布局。 理解问题根源:不规范…

    2025年12月23日
    000
  • Laravel开发:如何在编辑界面正确预选数据库中的多选标签

    本文旨在解决laravel应用中编辑界面多选(select multiple)标签无法自动预选数据库中已保存数据的问题。通过详细讲解控制器层的数据准备和视图层的条件渲染逻辑,我们将展示如何利用blade模板引擎和eloquent关系,确保用户在编辑时能直观看到并修改此前选择的标签,同时提供最佳实践,…

    2025年12月23日
    000
  • Laravel Blade 条件渲染:根据数据状态控制 HTML 元素显示

    本文将介绍在 laravel blade 模板中如何根据数据变量的值是否为空或不存在,来有条件地渲染 html 元素,例如 ` ` 标签。通过利用 blade 的 `@if` 指令结合 php 的 `empty()` 函数,开发者可以确保只有当数据有效时才显示相关内容,从而避免渲染空标签或不必要的信…

    2025年12月23日
    000
  • JavaScript按钮实现PUT/POST重定向与数据提交:模拟表单行为的教程

    本教程详细讲解如何通过JavaScript动态创建并提交隐藏表单,以实现从按钮点击触发的PUT或POST请求重定向,并携带请求体数据。这种方法无需使用`fetch` API,能够满足浏览器自动处理Cookie的需求,为需要模拟完整表单提交行为的场景提供了有效的解决方案。 引言:理解PUT/POST重…

    2025年12月23日
    000
  • PHP多语言网站:语言切换与内容翻译的最佳实践

    本教程旨在指导开发者如何在php项目中实现健壮的多语言切换功能。文章详细介绍了基于会话(session)的语言状态管理、通过url参数进行语言切换的方法,并提出了一套功能完善的辅助函数来加载和安全地检索翻译内容,从而有效避免常见的“未定义变量”或“非法字符串偏移”错误。通过结构化的代码示例和最佳实践…

    2025年12月23日
    000
  • 优化长HTML属性值:SonarQube警告与实用策略

    本文探讨html表单`action`属性过长导致sonarqube警告的问题,并提供三种解决方案:优化url结构、通过变量预构建url,以及灵活评估代码规范。重点推荐使用变量预构建url,以提升代码可读性和维护性,同时兼顾静态分析工具的建议与实际开发需求。 引言:处理HTML长属性值的挑战 在现代W…

    2025年12月23日
    000
  • 使用JavaScript从按钮触发GET重定向或模拟POST/PUT提交的教程

    本教程详细介绍了如何通过JavaScript从按钮触发客户端重定向,以实现类似表单提交的效果,同时确保浏览器Cookie的正常处理。文章涵盖了两种主要方法:一是使用location.href进行带查询参数的GET重定向,适用于简单的导航或GET请求触发的动作;二是通过动态创建和提交隐藏表单来模拟PO…

    2025年12月23日
    000
  • Mac Valet一键站点,HTML+CSS开发环境王者!

    首先确认Valet服务已安装并运行,通过valet install和valet start初始化;使用valet park将项目目录设为可自动访问的本地根目录,新增项目即享.test域名;对独立项目可用valet link绑定自定义.test域名;为优化静态文件支持,在项目根目录创建.valet/s…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信