furiosojack/lara-exception

此包已被弃用且不再维护。没有建议的替代包。

这是一个异常生成器,其目的是向用户抛出可控的异常,同时可以为开发者生成详细的日志。该包默认可以检测到HTTP请求中的application/json。当HTTP请求正常时,该包会向用户展示错误信息和错误代码,如果请求是JSON格式,错误将以JSON格式返回。

v1.0.2 2018-10-05 16:22 UTC

This package is auto-updated.

Last update: 2020-09-12 19:41:01 UTC


README

Latest Stable Version Total Downloads License

GitHub forks GitHub stars GitHub issues

西班牙语

许可证

许可证代码必须严格遵守,如果您使用此库,则必须在所有副本中包含版权信息。

更多信息请参阅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正常请求,则会显示一个视图

ver

日志示例

ver

自定义异常

视觉样式(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\AppServiceProviderregister方法中注册它;如果您正在处理一个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异常,使用其助手,并额外指定我想用的样式,最后输出我想要的错误代码。🙀 🙀 🙀 🙀

然而,这只是用一点想象力可以做到的成千上万件事情之一。😏 😏 😏 💪

结束