我使用的是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
参数,并注释掉if
和try
语句,则会按预期处理成功付款。
我在这里做错了什么?
修改
如果我说\Exception $e
我得到:
(1/1) BindingResolutionException
Unresolvable dependency resolving [Parameter #0 [ <optional> $message ]] in class Exception
in Container.php (line 910)
答案 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
文件中执行此操作。有两种方法:
report
:如果您想使用自定义格式记录异常。render
:如果要返回对该异常的自定义HTTP响应。 在您的情况下,您需要自定义回复:
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。
希望这会给你一些想法。