文章转发自专业的Laravel开发者社区,原始连接:learnku.com/laravel/t/3…laravel
在这篇博客文章中,我将告诉你关于 Ignition 的一切。git
让咱们看看默认状况下 PHP 中有什么。在不使用框架的状况下,PHP 提供了这个功能。您只会获得错误:没有堆栈跟踪、没有请求或应用程序详情。github
Symfony 的错误页面稍微好一些,它向您显示堆栈跟踪,可是没有多大帮助。web
这是 Ignition 的截图,咱们创建的新的错误视图。由于这是 Laravel 特有的,咱们能够作不少很酷的事情。数组
让咱们来探索 Ignition 全部的细节。它是开源的,您能够在这里查看代码(github.com/facade/igni…)。浏览器
若是视图中有错误,这就是 whoops 显示它们的方式。注意,异常消息不适合分配的空间。你必须(鼠标)悬停在它上面才能看完整(信息)。在堆栈跟踪中,您能够看到使用了编译后的 Blade 视图和内容。这使得跟踪哪一个 Blade 视图文件包含错误变得困难,而且视图内容自己是不可读的。bash
Ignition是一个 Laravel 特定的错误页面。所以,它能够像钩子同样,"挂载"到框架中, 用来显示未编译的视图路径和您的 Blade 视图。顶部还有足够的空间显示整个异常页面,不须要额外的单击。咱们也只在默认状况下显示应用程序帧,由于这些多是您感兴趣的帧。app
若是您单击 stack trace
选项卡右侧文件名旁边的铅笔图标,咱们将在您喜欢的编辑器中自动打开该文件。默认状况下是 PhpStorm 。您能够在 ignition
配置文件中将其配置为您最喜欢的编辑器。框架
注意到右上角的那个小“望远镜”连接了吗?咱们只会在您安装了Laravel Telescope(第一方调试助手)的状况下显示。若是你点击那个连接,你将被带到望远镜内发生错误的异常。编辑器
若是咱们默认的错误屏幕太亮了,你会很高兴知道咱们的错误页面也有一个黑暗模式。
让咱们探索一下 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
。
想学习如何添加自定义选项卡, 请访问 the documentation on adding tabs.