furiosojack / lara-exception
这是一个异常生成器,其目的是向用户抛出可控的异常,同时可以为开发者生成详细的日志。该包默认可以检测到HTTP请求中的application/json。当HTTP请求正常时,该包会向用户展示错误信息和错误代码,如果请求是JSON格式,错误将以JSON格式返回。
Requires
- php: >= 7
- laravel/framework: ~5.6
README
西班牙语
许可证
许可证代码必须严格遵守,如果您使用此库,则必须在所有副本中包含版权信息。
更多信息请参阅LICENSE.txt文件。
描述
这是一个异常生成器,其目的是向用户抛出可控的异常,同时可以为开发者生成详细的日志。
该包默认可以检测到HTTP请求中的application/json。
当HTTP请求正常时,该包会向用户展示错误信息和错误代码,如果请求是JSON格式,错误将以JSON格式返回。
安装
在项目根目录下执行以下命令:
$ composer require furiosojack/lara-exception
或者直接在composer.json
文件中添加
{ "require": { "furiosojack/lara-exception": "^1.0.0" } }
如果您使用的是Laravel < 5.6
版本,需要执行以下操作 ⬇️ ⬇️
然后在config/app.php
文件中包含以下service provider
'providers' => [ FuriosoJack\LaraException\Providers\LaraExceptionServiceProvider::class, ];
以及在同一文件中的以下alias
'aliases' => [ 'LaraException' => FuriosoJack\LaraException\Facades\LaraExceptionFacade::class, ],
如果您使用的是Laravel < 5.6
版本,需要执行以下操作 ⬆️ ⬆️
在您的app/Exceptions/Handler.php
文件中,需要包含LaraExceptionManager
类。可以这样做。
导入类
use FuriosoJack\LaraException\Exceptions\LaraExceptionManager;
现在,将Handler.php
类从继承自ExceptionHandler
改为继承自LaraExceptionManager
结果如下
namespace App\Exceptions; use Exception; use Illuminate\Auth\AuthenticationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use FuriosoJack\LaraException\Exceptions\LaraExceptionManager; class Handler extends LaraExceptionManager {
最后,您需要更新配置。可以在控制台中执行以下命令。
$ php artisan vendor:publish --tag=config.lara_exception
方法
该包提供了一些参数以实现最个性化的异常。
-
message(
string
) - 必填 ‼️ 此方法接收要显示在异常中的字符串消息
📐 始终可见 -
debugCode(
int
) - 此方法接收一个整数,对应异常的错误代码(在错误参数化时使用)。如果未指定错误代码,则默认为0。📐 始终可见 -
details(
string
) - 此方法接收一个字符串,对应错误的详细信息,通常用于向程序员提供更多细节,默认不会向用户显示,但会显示在日志中。📐 可见或隐藏 -
withLog() - 此方法不接受任何参数。它用于指示希望为该异常生成日志。日志存储取决于项目的配置,如果未修改日志位置,则这些日志将存储在
storage/logs/laravel.log
,如果指定了详细信息,则错误始终会显示在日志中。 -
showDetails() - 此方法允许显示显示给用户的异常的详细信息,无论是通过HTTP正常请求还是JSON。
-
showErrors() - 显示响应中的错误,如果未指定错误,则显示为null。
-
errors(
array
) 接收一个数组,其中包含要附加到主要错误上的错误,这些错误仅在使用showErrors
时显示给用户。 -
style(
string
) 接收一个字符串,允许指定一个与config/LaraException
中的key
对应的视觉样式。 (阅读章节) -
build(
int = 200
) - 这是必须最后调用的方法。 必需 ‼️ 此方法负责抛出异常,可以指定HTTP响应代码(HTTP STATUS CODE),默认情况下为200
。
示例
抛出一个带有指定消息的异常
\LaraException::message("hola mundo")->build();
抛出一个带有自定义调试代码的异常
\LaraException::message("hola mundo")->debugCode(15)->build();
抛出一个带有详细信息和自定义调试代码的异常
\LaraException::message("hola mundo") ->debugCode(15) ->details("Ya dije hola mundo?") ->build();
抛出一个带有详细信息和自定义调试代码以及日志的异常
\LaraException::message("hola mundo") ->debugCode(15) ->details("Ya dije hola mundo?") ->withLog() ->build();
抛出一个带有详细信息和自定义调试代码以及日志,并将详细信息显示给用户的异常
\LaraException::message("hola mundo") ->debugCode(15) ->details("Ya dije hola mundo?") ->withLog() ->showDetails() ->showErrors() ->build();
在以下示例中,对应的是以数组形式发送错误的方式,仅当请求包含header Accept: applitacion/json
时才有效
\LaraException::message("hola mundo") ->debugCode(15) ->details("Ya dije hola mundo?") ->withLog() ->errors([ "juan" => "nombre invalido", "petro" => "nombre no existe" ]) ->showDetails() ->build();
可以根据需要组合这些方法,但显然,方法 build()
必须始终是最后一个。
也可以使用辅助工具而不是前面显示的门面,要使用辅助工具,可以使用已显示的相同方法,例如要执行
该函数将接收的第一个参数将是消息
lara_exception("hola mundo") ->debugCode(15) ->details("Ya dije hola mundo?") ->withLog() ->errors([ "juan" => "nombre invalido", "petro" => "nombre no existe" ]) ->showDetails() ->build();
输出
如果请求是JSON,则响应将类似于
{ "error": "hola mundo", "errors": { "juan": "nombre invalido", "petro": "nombre no existe" }, "debugCode": 15, "details": "Ya dije hola mundo?", "success": false }
如果是HTTP正常请求,则会显示一个视图
日志示例
自定义异常
视觉样式(view)
仅适用于从浏览器发生或不是JSON请求的异常!!!!
如果您需要项目或包具有独特的异常视觉样式(视图)或具有特殊功能。
也就是说,如果您正在编写一个Laravel包,并且很可能其他人也会使用LaraException,并且希望您的包具有独特的异常视觉样式,或者如果您正在编写一个Laravel项目并且需要不同的视觉样式。
为此,需要在项目的 config/LaraException.php
配置文件中创建一个样式,格式如下:
'blog' => [ 'view' => 'blog.user.exceptions', 'redirect' => true ]
我们将blog
作为key
,这意味着这种样式称为博客,现在在这个数组中存在两个键,即view
,它代表当发生异常时显示的视图。
redirect
键表示是否希望在发生异常时将用户重定向到LaraException的URL(/LaraException?errors=dsfdsfsdfsd
)。
📝 备注:
我建议将其设置为true
,因为这允许当用户发起POST
类型的请求并抛出异常时,该异常会被重定向,从而防止用户通过F5或刷新页面再次触发错误。
既然您已经定义了一种样式,您可以使用以下方式使用LaraException:
lara_exception("mensaje") ->style('blog') ->details('detalles de la excepcion') ->build(500);
这样,当发生异常时,显示给用户的视图将是您在配置中指定的视图。
新视图
如果您想要创建一个新的视图,是因为您有一个新的异常样式,但如果您想每次抛出LaraExcepcion时都使用不同的视图(而不是默认视图),我们建议您阅读下一节。
为了创建与LaraExeption兼容的视图,该视图必须是blade。您在视图中可以访问以下变量:
- $message
- $errors
- $debugCode
- $details
- $routeBack:这是上一个路由的URL
编辑默认视图
要编辑默认视图,您需要在项目中发布它。为了做到这一点,请在控制台中执行以下操作:
$ php artisan vendor:publish --tag=views.lara_exception
这样,现在您将拥有这个文件夹 resources\views\vendor\LaraException
,其中将包含您将要定制的名为error.blade.php的视图。
捕获其他异常和规则 🙀
通常情况下,如果您的项目有其他类型的异常,而这些异常并不是由LaraException抛出的。
例如,当访问一个不存在的路由时,会抛出NotFoundHttpException
异常,Laravel会默认显示一个包含错误消息“Sorry, the page you are looking for could not be found.”的视图。
如果您希望LaraExcepcion也处理这类异常,并返回您想要的视图,或者只是简单地抛出一个LaraExcepcion异常,您需要做以下操作:
例如,我们想要当抛出NotFoundHttpException
异常且URL中包含文本blog时,触发LaraExcepcion异常。
因此,需要在一个服务提供者中添加,如果您正在处理一个项目,应该在App\Providers\AppServiceProvider
的register
方法中注册它;如果您正在处理一个Laravel包,应在服务提供者的register
方法中添加。
lara_exception_masterManager()->addExceptionCallBack(function($request, \Exception $exception){ if(strpos($request->getPathInfo(),"/blog") !== FALSE){ if($exception instanceof NotFoundHttpException){ lara_exception("Not Fount")->style('blog')->build(404); } } });
通过LaraException的MasterManager的addExceptionCallBack
方法,您可以指定一个包含所需逻辑的函数,但在这个例子中,是执行一个LaraExcepcion异常,当抛出NotFoundHttpException
异常且URL包含文本blog
时。
添加的函数接收两个参数,即$request
(请求对象)和$exception
(抛出的异常)。
以示例继续,我检查在URL中是否存在“blog url”这个词,这个词是通过请求对象的getPathInfo
方法获取的,如果存在,我就会抛出一个LaraExcepcion异常,使用其助手,并额外指定我想用的样式,最后输出我想要的错误代码。🙀 🙀 🙀 🙀
然而,这只是用一点想象力可以做到的成千上万件事情之一。😏 😏 😏 💪