Laravel Ignition 功能全解析

文章轉發自專業的Laravel開發者社區,原始連接: https://learnku.com/laravel/t...

在這篇博客文章中,我將告訴你關於 Ignition 的一切。laravel

讓咱們看看默認狀況下 PHP 中有什麼。在不使用框架的狀況下,PHP 提供了這個功能。您只會獲得錯誤:沒有堆棧跟蹤、沒有請求或應用程序詳情。git

Symfony 的錯誤頁面稍微好一些,它向您顯示堆棧跟蹤,可是沒有多大幫助。github


下面的截圖是 Whoops,這是 Laravel 5 中的標準。它比默認的 Symfony 好得多,能夠顯示堆棧跟蹤和一些關於請求的信息。儘管在 Laravel 中 Whoops 是默認值,但它是一個框架無關的(錯誤收集展現)。它僅僅顯示通用信息。web

這是 Ignition 的截圖,咱們創建的新的錯誤視圖。由於這是 Laravel 特有的,咱們能夠作不少很酷的事情。數組

發現 Ignition

讓咱們來探索 Ignition 全部的細節。它是開源的,您能夠在這裏查看代碼(https://github.com/facade/ign...瀏覽器

若是視圖中有錯誤,這就是 whoops 顯示它們的方式。注意,異常消息不適合分配的空間。你必須(鼠標)懸停在它上面才能看完整(信息)。在堆棧跟蹤中,您能夠看到使用了編譯後的 Blade 視圖和內容。這使得跟蹤哪一個 Blade 視圖文件包含錯誤變得困難,而且視圖內容自己是不可讀的。app

Ignition是一個 Laravel 特定的錯誤頁面。所以,它能夠像鉤子同樣,"掛載"到框架中, 用來顯示未編譯的視圖路徑和您的 Blade 視圖。頂部還有足夠的空間顯示整個異常頁面,不須要額外的單擊。咱們也只在默認狀況下顯示應用程序幀,由於這些多是您感興趣的幀。框架

若是您單擊 stack trace 選項卡右側文件名旁邊的鉛筆圖標,咱們將在您喜歡的編輯器中自動打開該文件。默認狀況下是 PhpStorm 。您能夠在 ignition 配置文件中將其配置爲您最喜歡的編輯器。編輯器

注意到右上角的那個小「望遠鏡」連接了嗎?咱們只會在您安裝了Laravel Telescope(第一方調試助手)的狀況下顯示。若是你點擊那個連接,你將被帶到望遠鏡內發生錯誤的異常。ide

黑暗模式

若是咱們默認的錯誤屏幕太亮了,你會很高興知道咱們的錯誤頁面也有一個黑暗模式。

Ignition 選項卡

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

「請求」選項卡

在「堆棧跟蹤」選項卡旁邊,您將看到「請求」選項卡。它顯示了您對請求的全部預期信息。

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

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

當此路由發生異常,咱們將在 Ignition 中打印 路由參數 post 模型($post 變量),以轉化後數組(toArray )形式呈現。對於不須要任何綁定的「簡單」路由參數也是如此。這是一個很好的方法,能夠很容易地看到 Laravel 爲這個特定的路由接收了什麼信息。

在路由參數以後,咱們還將向您顯示在此請求中使用的中間件列表。

接下來是「視圖」部分。若是異常發生在視圖中,咱們將在這裏顯示視圖名稱。甚至:咱們還將給出傳遞給視圖的全部數據的列表。

用戶選項卡

"用戶" 選項卡包含有使用應用程序的用戶和瀏覽器的更多信息。

上下文選項卡

Context 選項卡中,咱們顯示關於您的 repo (repo位於何處,簽出提交hash)和環境(您使用的 PHP 和 Laravel 的哪一個版本)的信息。

調試選項卡

Debug 選項卡中,咱們將顯示異常發生以前發生的事情。好比查詢、日誌和轉儲。在轉儲旁邊,咱們還顯示您將 dump 語句放在何處的文件名。單擊鉛筆圖標,您就能夠直接訪問該文件,並在您最喜歡的編輯器中糾正行號。

建議的解決方案

讓咱們來看一下另外一個錯誤。此次咱們將忘記導入 Class。Ignition 報錯頁面是這樣的。

因此,Ignition 在看到異常是關於一個沒有找到的 Class 時。它將嘗試找出在其餘命名空間中是否存在這個 Class。若是存在的話,它會建議咱們導入。

Ignition 自帶一系列常見問題的解決方案。若沒有找到Blade視圖,會採用一個無效視圖以下所示。

您還能夠自定義異常解決方案。須要異常類實現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 中拋出異常的樣子。

運行解決方案

除了僅僅是建議的解決方案,咱們也能夠運行它們。想象一下,例如,您忘記設置app key。這是用 Ignition 展現錯誤的樣子。

若是你點擊「生成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 的樣子.

當用戶點擊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


咱們還建立了第二個包, 名爲 facade/ignition-code-editor。這個選項卡替換了默認的stack trace選項卡,使用一個自定義選項卡,容許您在錯誤屏幕上編輯代碼。它就在以下操做。

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

相關文章
相關標籤/搜索