如何处理Laravel 5.4中的异常?

时间:2018-03-18 12:38:49

标签: php laravel laravel-5.4

我使用的是Laravel 5.4,并且我使用Stripe作为支付处理器。

Stripe方面似乎正在起作用,但我正在努力解决这些例外情况。下面的代码似乎以前工作,但也许它使用缓存中已被清除的文件:

namespace App\Http\Controllers;

// Do I need to use anything at the top??
// use Exception; 

class ItemController extends Controller
{
    public function postCheckout(Request $request, Exception $e)
    {
        if ($e instanceof \Illuminate\Session\TokenMismatchException) {
            return redirect()->back()->withInput()->with(
                'token', csrf_token()
            );
        }

        try {
            // ...
        } catch (\Exception $e) {
            return redirect()->route('checkout')->with(
                'error', $e->getMessage()
            );
        }
    }
}

出现错误:

(1/1) ReflectionException
Class App\Http\Controllers\Exception does not exist
in RouteSignatureParameters.php (line 25)

如果我从方法中删除Exception $e参数,并注释掉iftry语句,则会按预期处理成功付款。

我在这里做错了什么?

修改

如果我说\Exception $e我得到:

(1/1) BindingResolutionException
Unresolvable dependency resolving [Parameter #0 [ <optional> $message ]] in class Exception
in Container.php (line 910)

1 个答案:

答案 0 :(得分:1)

让我们了解PHP中的命名空间和类型提示。如果你这样编码:

namespace App\Http\Controllers;

class ItemController extends Controller
{
    public function postCheckout(Request $request, Exception $e)
    {
        ...
    }
}

这意味着您的postCheckout方法期望第二个参数是类App\Http\Controllers\Exception的实例。这就是为什么如果这个异常类不存在你得到这样的错误:

Class App\Http\Controllers\Exception does not exist

我不确定您的情况,因为我不知道如何从代码的其他部分调用此postCheckout方法。但是,如果您希望第二个参数是内置的PHP Exception类,则可以使用如下所示的完整路径命名空间:

namespace App\Http\Controllers;

class ItemController extends Controller
{
    public function postCheckout(Request $request, \Exception $e)
    {
        ...
    }
}

或者您也可以导入上面的目标类名称空间:

use Exception;
namespace App\Http\Controllers;

class ItemController extends Controller
{
    public function postCheckout(Request $request, Exception $e)
    {
        ...
    }
}

第二个错误发生的原因是Laravel的容器无法解析postCheckout方法所需的依赖关系。

(1/1) BindingResolutionException
Unresolvable dependency resolving...

从这个错误和你的类的名称,我假设你使用这个postCheckout方法作为路由处理程序?

Route::post('/foo', 'ItemController@postCheckout');

如果是这种情况,那么你不是用Laravel捕获异常的方式。要在Laravel中处理异常,您可以在app/Exceptions/Handler.php文件中执行此操作。有两种方法:

  1. report:如果您想使用自定义格式记录异常。
  2. render:如果要返回对该异常的自定义HTTP响应。
  3. 在您的情况下,您需要自定义回复:

    public function render($request, Exception $exception)
    {
        if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
            // Perform the exception handler here
        }
    
        return parent::render($request, $exception);
    }
    

    同样的事情也适用于您的Stripe相关异常,您可以在此Handler类中处理它。详细了解The render Method

    希望这会给你一些想法。