文章轉發自專業的Laravel開發者社區,原始連接: https://learnku.com/laravel/t...
在這篇博客文章中,我將告訴你關於 Ignition 的一切。laravel
讓咱們看看默認狀況下 PHP 中有什麼。在不使用框架的狀況下,PHP 提供了這個功能。您只會獲得錯誤:沒有堆棧跟蹤、沒有請求或應用程序詳情。git
Symfony 的錯誤頁面稍微好一些,它向您顯示堆棧跟蹤,可是沒有多大幫助。github
下面的截圖是 Whoops,這是 Laravel 5 中的標準。它比默認的 Symfony 好得多,能夠顯示堆棧跟蹤和一些關於請求的信息。儘管在 Laravel 中 Whoops 是默認值,但它是一個框架無關的(錯誤收集展現)。它僅僅顯示通用信息。web
這是 Ignition 的截圖,咱們創建的新的錯誤視圖。由於這是 Laravel 特有的,咱們能夠作不少很酷的事情。數組
讓咱們來探索 Ignition 全部的細節。它是開源的,您能夠在這裏查看代碼(https://github.com/facade/ign...。瀏覽器
若是視圖中有錯誤,這就是 whoops 顯示它們的方式。注意,異常消息不適合分配的空間。你必須(鼠標)懸停在它上面才能看完整(信息)。在堆棧跟蹤中,您能夠看到使用了編譯後的 Blade 視圖和內容。這使得跟蹤哪一個 Blade 視圖文件包含錯誤變得困難,而且視圖內容自己是不可讀的。app
Ignition是一個 Laravel 特定的錯誤頁面。所以,它能夠像鉤子同樣,"掛載"到框架中, 用來顯示未編譯的視圖路徑和您的 Blade 視圖。頂部還有足夠的空間顯示整個異常頁面,不須要額外的單擊。咱們也只在默認狀況下顯示應用程序幀,由於這些多是您感興趣的幀。框架
若是您單擊 stack trace
選項卡右側文件名旁邊的鉛筆圖標,咱們將在您喜歡的編輯器中自動打開該文件。默認狀況下是 PhpStorm 。您能夠在 ignition
配置文件中將其配置爲您最喜歡的編輯器。編輯器
注意到右上角的那個小「望遠鏡」連接了嗎?咱們只會在您安裝了Laravel Telescope(第一方調試助手)的狀況下顯示。若是你點擊那個連接,你將被帶到望遠鏡內發生錯誤的異常。ide
若是咱們默認的錯誤屏幕太亮了,你會很高興知道咱們的錯誤頁面也有一個黑暗模式。
讓咱們探索一下 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
。
所以,你有能力使用文本或者可運行的解決方案來加強本身的異常。 但有時須要爲內置的 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.