首頁  >  文章  >  php框架  >  一文介紹Laravel Ignition的一切

一文介紹Laravel Ignition的一切

藏色散人
藏色散人轉載
2021-07-09 11:48:492199瀏覽

在這篇部落格文章中,我將告訴您 Ignition 的一切。

讓我們看看預設情況下 PHP 中有什麼。在不使用框架的情況下,PHP 提供了這個功能。您只會得到錯誤:沒有堆疊追蹤、沒有請求或應用程式詳情。
PHP 错误

Symfony 的錯誤頁面稍微好一些,它向您顯示堆疊跟踪,但是沒有多大幫助。

Symfony 错误

下面的截圖是 Whoops,這是 一文介紹Laravel Ignition的一切 5 中的標準。它比預設的 Symfony 好得多,可以顯示堆疊追蹤和一些關於請求的資訊。儘管在 一文介紹Laravel Ignition的一切 中 Whoops 是預設值,但它是一個框架無關的(錯誤收集顯示)。它僅僅顯示通用資訊。

Whoops 错误

這是 Ignition 的截圖,我們建立的新的錯誤視圖。因為這是 一文介紹Laravel Ignition的一切 特有的,我們可以做很多很酷的事。

Ignition 错误

發現 Ignition

讓我們來探索 Ignition 所有的細節。它是開源的,您可以在這裡查看程式碼(https://github.com/facade/ignition)。

如果視圖中有錯誤,這就是 whoops 顯示它們的方式。注意,異常訊息不適合分配的空間。你必須(滑鼠)懸停在它上面才能看完整(資訊)。在堆疊追蹤中,您可以看到使用了編譯後的 Blade 視圖和內容。這使得追蹤哪個 Blade 視圖檔案包含錯誤變得困難,並且視圖內容本身是不可讀的。

Whoops 视图错误

Ignition是一個 一文介紹Laravel Ignition的一切 特定的錯誤頁面。因此,它可以像鉤子一樣,"掛載"到框架中, 用來顯示未編譯的視圖路徑和您的 Blade 視圖。頂部還有足夠的空間顯示整個異常頁面,不需要額外的點擊。我們也只在預設情況下顯示應用程式幀,因為這些可能是您感興趣的幀。

Ignition 视图错误

如果您單擊stack trace 選項卡右側文件名旁邊的鉛筆圖標,我們將在您喜歡的編輯器中自動打開該文件。預設是 PhpStorm 。您可以在 ignition 設定檔中將其配置為您最喜歡的編輯器。

注意到右上角的那個小「望遠鏡」連結了嗎?我們只會在您安裝了一文介紹Laravel Ignition的一切 Telescope(第一方調試助手)的情況下顯示。如果你點擊那個鏈接,你將被帶到望遠鏡內發生錯誤的異常。

黑暗模式

如果我們預設的錯誤畫面太亮了,你會很高興知道我們的錯誤頁面也有一個黑暗模式。

Dark mode

Ignition 選項卡

讓我們探索一下 Ignition 頁面上顯示的選項卡。

「請求」標籤

Request tab

在「堆疊追蹤」標籤旁邊,您將看到「請求」標籤。它顯示了您對請求的所有預期資訊。

假設你有一個路由定義是這樣的::

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

當此路由發生異常,我們將在Ignition 中列印路由參數post 模型( $post 變數),以轉換後陣列(toArray )形式呈現。對於不需要任何綁定的「簡單」路由參數也是如此。這是一個很好的方法,可以很容易地看到 一文介紹Laravel Ignition的一切 為這個特定的路由接收了什麼資訊。

在路由參數之後,我們也會向您顯示在此請求中使用的中間件清單。

接下來是「視圖」部分。如果異常發生在視圖中,我們將在這裡顯示視圖名稱。甚至:我們還將給出傳遞給視圖的所有資料的清單。

使用者選項卡

User tab

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

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

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

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

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

建议的解决方案

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

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

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

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

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

namespace App\Exceptions;

use Exception;
use Facade\IgnitionContracts\Solution;
use Facade\IgnitionContracts\BaseSolution;
use Facade\IgnitionContracts\ProvidesSolution;

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 中抛出异常的样子。

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

运行解决方案

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

App key 丢失

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

App key 生成

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

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

namespace App\Exceptions;

use Exception;
use Facade\IgnitionContracts\ProvidesSolution;

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

下面是实现类MyRunnableSolution.示例

namespace App\Solutions;

use Facade\IgnitionContracts\RunnableSolution;

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 的样子.

一文介紹一文介紹Laravel Ignition的一切 Ignition的一切

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

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

使 Ignition 更聪明

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

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

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

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

use Throwable;
use RuntimeException;
use Facade\IgnitionContracts\Solution;
use Facade\Ignition\Solutions\GenerateAppKeySolution;
use Facade\IgnitionContracts\HasSolutionForThrowable;

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 App\Providers;

use App\Solutions\GenerateAppKeySolution;
use Facade\IgnitionContracts\SolutionProviderRepository;
use Illuminate\Support\ServiceProvider;

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 Ignition的一切

想學習如何添加自訂選項卡, 請訪問 the documentation on adding tabs.

相關推薦:最新的五個一文介紹Laravel Ignition的一切視頻教學

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

譯文網址:https://learnku.com/laravel/t/33857

以上是一文介紹Laravel Ignition的一切的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除