Laravel开发Ignition函数全解析
关于Ignition的一切。
让我们看看 PHP 默认有什么。 PHP 无需使用框架即可提供此功能。您只会收到错误:没有堆栈跟踪、没有请求或应用程序详细信息。
Symfony 的错误页面好一点,它向您显示堆栈跟踪,但没有太大帮助。
下面的截图来自 Whoops,它是 Laravel 5 中默认的。它比默认的 Symfony 好得多,可以显示堆栈跟踪和有关请求的一些信息。尽管 Whoops 是 Laravel 中的标准,但它与框架无关(调试视图)。它仅显示一般信息。
这是我们创建的新错误显示 Ignition 的屏幕截图。由于这是 Laravel 特有的,因此我们可以做很多很酷的事情。
探索 Ignition
让我们探索 Ignition 的所有细节。它是开源的,您可以在此处查看代码(github.com/facade/igni...)。
如果视图中存在错误,whoops 就会这样显示错误。请注意,异常消息不适合分配的空间。您必须将鼠标悬停在其上才能看到整体(信息)。在堆栈跟踪中,您可以看到使用了编译的 Blade 视图和内容。这使得很难追踪哪个 Blade 视图文件包含错误,并且视图内容本身不可读。
Ignition 是 Laravel 特定的错误页面。因此,它可以像钩子一样“钩”到框架中,并用于公开未编译的视图路径和 Blade 视图。顶部还有足够的空间来显示整个异常页面,而无需额外单击。默认情况下,我们也仅显示应用程序框架,因为这些框架可能是您感兴趣的框架。
单击堆栈跟踪选项卡右侧文件名旁边的铅笔图标将自动打开文件在您最喜欢的编辑器中。默认是 PhpStorm。您可以在配置文件ignition中将其配置为您的首选编辑器。
注意到右上角的小“望远镜”链接了吗?仅当您安装了 Laravel Telescope(第一方调试助手)时,我们才会显示它。如果您单击该链接,您将进入望远镜出现问题的异常情况。
深色模式
如果我们的默认错误屏幕太亮,您会很高兴知道我们的错误页面也有深色模式。
Ignition 选项卡
让我们探索一下Ignition 页面上显示的选项卡。
“请求”选项卡
在“堆栈跟踪”选项卡旁边,您将看到“请求”选项卡。它显示您的请求的所有预期信息。
假设你有这样的路由定义::
Route::get('/posts/{post}', function (Post $post) {
//
});
复制代码当该路由发生异常时,我们打印 Ignition post 模型中的路由参数 (❀❀ ),呈现以转换数组的形式 (toArray)。这同样适用于不需要绑定的“简单”路由参数。这是轻松查看 Laravel 正在接收该特定路线的信息的好方法。
在路由参数之后,我们还会向您展示该请求中使用的中间件列表。
接下来是视图部分。如果视图中发生异常,我们会在此处显示视图名称。更重要的是:我们还将提供发送到视图的所有数据的列表。
“用户”选项卡
“用户”选项卡包含有关使用该应用程序的用户和浏览器的更多信息。
上下文选项卡
在上下文选项卡中,我们显示有关您的repo(存储库所在位置)以及提交所在位置的信息(PHP 和 Laravel 的版本)信息。
调试选项卡
在调试选项卡中,我们显示异常发生之前发生的情况。例如查询、日志和转储。在转储旁边,我们还显示您放置 dump 语句的文件名。单击铅笔图标,您可以直接访问该文件并在您喜欢的编辑器中更正行号。
建议的解决方案
让我们看看另一个错误。这次我们忘记导入类了。点火错误页面如下所示。
因此,当 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 中抛出异常时的样子。
运行解决方案
除了建议的解决方案之外,我们还可以运行它们。例如,假设您忘记设置应用程序键。这就是 Ignition 出现的错误。
如果您点击“生成应用程序密钥”按钮,我们将在后台生成并设置应用程序密钥。
刷新页面后,应用程序将正常工作(除非包含其他异常)
可以通过让异常实现 以下是实现类 以下是如何在 Ignition 中抛出自定义异常 用户点击器 您可以将发生异常的请求中的参数传递给将运行解决方案的请求。让 因此您可以选择使用文本或可执行解决方案来改进自己的异常。但有时有必要为内置 PHP 异常,甚至是您无法控制代码的第三方异常提供友好的解决方案。 我们允许您使用“解决方案提供商”来解决上述痛点。解决方案提供者是可以通过 Ignition 插入解决方案发现过程的类。当抛出异常并且 Ignition 接收到该异常时,您可以调用自定义解决方案提供程序来返回该异常的一种或多种可能的解决方案。 例如,您可以创建一个自定义 Stack Overflow 解决方案提供程序,它将尝试查找给定异常的匹配 Stack Overflow 结果并将其作为解决方案返回。 我们还在 Ignition 本身上使用解决方案提供商。此类解决方案提供商的外观如下: 这些解决方案提供商可以在 Ignition 中自动注册,如下所示: 同样,解决方案提供商将继续针对您的例外情况增强 Ignitions 功能。解决方案已提供,我们迫不及待地想看看社区将提供什么! 点火是可扩展的。您可以添加新选项卡或替换默认选项卡。 让我们看一下随附的正面/点火选项卡。这个包是一个基于 spatie/laravel-web-tinker 的包装器,允许您在浏览器中使用 安装了 Facade/ignition Tinker 风扇后,您可以在错误页面上使用 我们还创建了另一个名为 Facade/ignition code editor 的软件包。此选项卡将默认的堆栈跟踪选项卡替换为自定义选项卡,该选项卡允许您在错误屏幕上编辑代码。这就是它的作用。 如果您想了解如何添加自定义选项卡,请参阅添加选项卡文档。 作者:Summer__Facade\Ignition Contracts\Provides,来创建可执行的解决方案,不同的是不起作用 运行的解决方案非常相似)。 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 [];
}
}
复制代码CustomException。帮我修复此问题 当 按钮已修复时。 run 功能将被执行。 getRunParameters 返回一个数组。该数组将传递到 run。 让 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()
];
}
}
复制代码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);
}
}
复制代码自定义点火
Artisan Tinker。 Artisan Tinker。
链接:https://juejin.im/post/5d7af71ff265da03f04cfae:N4cfae: 版权归作者所有。商业转载请联系作者获取授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网
