在這篇部落格文章中,我將告訴您 Ignition 的一切。
讓我們看看預設情況下 PHP 中有什麼。在不使用框架的情況下,PHP 提供了這個功能。您只會得到錯誤:沒有堆疊追蹤、沒有請求或應用程式詳情。
Symfony 的錯誤頁面稍微好一些,它向您顯示堆疊跟踪,但是沒有多大幫助。
下面的截圖是 Whoops,這是 一文介紹Laravel Ignition的一切 5 中的標準。它比預設的 Symfony 好得多,可以顯示堆疊追蹤和一些關於請求的資訊。儘管在 一文介紹Laravel Ignition的一切 中 Whoops 是預設值,但它是一個框架無關的(錯誤收集顯示)。它僅僅顯示通用資訊。
這是 Ignition 的截圖,我們建立的新的錯誤視圖。因為這是 一文介紹Laravel Ignition的一切 特有的,我們可以做很多很酷的事。
讓我們來探索 Ignition 所有的細節。它是開源的,您可以在這裡查看程式碼(https://github.com/facade/ignition)。
如果視圖中有錯誤,這就是 whoops 顯示它們的方式。注意,異常訊息不適合分配的空間。你必須(滑鼠)懸停在它上面才能看完整(資訊)。在堆疊追蹤中,您可以看到使用了編譯後的 Blade 視圖和內容。這使得追蹤哪個 Blade 視圖檔案包含錯誤變得困難,並且視圖內容本身是不可讀的。
Ignition是一個 一文介紹Laravel Ignition的一切 特定的錯誤頁面。因此,它可以像鉤子一樣,"掛載"到框架中, 用來顯示未編譯的視圖路徑和您的 Blade 視圖。頂部還有足夠的空間顯示整個異常頁面,不需要額外的點擊。我們也只在預設情況下顯示應用程式幀,因為這些可能是您感興趣的幀。
如果您單擊stack trace
選項卡右側文件名旁邊的鉛筆圖標,我們將在您喜歡的編輯器中自動打開該文件。預設是 PhpStorm 。您可以在 ignition
設定檔中將其配置為您最喜歡的編輯器。
注意到右上角的那個小「望遠鏡」連結了嗎?我們只會在您安裝了一文介紹Laravel Ignition的一切 Telescope(第一方調試助手)的情況下顯示。如果你點擊那個鏈接,你將被帶到望遠鏡內發生錯誤的異常。
如果我們預設的錯誤畫面太亮了,你會很高興知道我們的錯誤頁面也有一個黑暗模式。
讓我們探索一下 Ignition
頁面上顯示的選項卡。
在「堆疊追蹤」標籤旁邊,您將看到「請求」標籤。它顯示了您對請求的所有預期資訊。
假設你有一個路由定義是這樣的::
Route::get('/posts/{post}', function (Post $post) { // });
當此路由發生異常,我們將在Ignition 中列印路由參數post
模型( $post
變數),以轉換後陣列(toArray
)形式呈現。對於不需要任何綁定的「簡單」路由參數也是如此。這是一個很好的方法,可以很容易地看到 一文介紹Laravel Ignition的一切 為這個特定的路由接收了什麼資訊。
在路由參數之後,我們也會向您顯示在此請求中使用的中間件清單。
接下來是「視圖」部分。如果異常發生在視圖中,我們將在這裡顯示視圖名稱。甚至:我們還將給出傳遞給視圖的所有資料的清單。
"用户" 选项卡包含有使用应用程序的用户和浏览器的更多信息。
在 Context
选项卡中,我们显示关于您的 repo
(repo位于何处,签出提交hash)和环境(您使用的 PHP 和 一文介紹Laravel Ignition的一切 的哪个版本)的信息。
在 Debug
选项卡中,我们将显示异常发生之前发生的事情。比如查询、日志和转储。在转储旁边,我们还显示您将 dump
语句放在何处的文件名。单击铅笔图标,您就可以直接访问该文件,并在您最喜欢的编辑器中纠正行号。
让我们来看一下另一个错误。这次我们将忘记导入 Class。Ignition 报错页面是这样的。
所以,Ignition 在看到异常是关于一个没有找到的 Class 时。它将尝试找出在其他命名空间中是否存在这个 Class。如果存在的话,它会建议我们导入。
Ignition 自带一系列常见问题的解决方案。若没有找到Blade视图,会采用一个一文介紹一文介紹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 中抛出异常的样子。
除了仅仅是建议的解决方案,我们也可以运行它们。想象一下,例如,您忘记设置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
。
因此,你有能力使用文本或者可运行的解决方案来增强自己的异常。 但有时需要为内置的 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 具有可扩展性。您可以添加新选项卡或替换默认选项卡。
讓我們來看看提供的 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.
相關推薦:最新的五個一文介紹Laravel Ignition的一切視頻教學
原文網址:https://freek.dev/1441-ignition-a-new-error-page-for-laravel
譯文網址:https://learnku.com/laravel/t/33857
以上是一文介紹Laravel Ignition的一切的詳細內容。更多資訊請關注PHP中文網其他相關文章!