我如何处理拉拉威尔 5.4 中的例外 ?

我在用拉拉威尔 5.4 , 我在用斯特成熟作为支付处理器。

史托迪那边似乎在工作 , 但我在为例外而挣扎。 下面的代码似乎在工作 , 但可能是使用缓存中的文件 , 这些文件已经清除 :

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)

EN From: How do I deal with Exceptions in Laravel 5.4?

1 Comments

  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 中的异常, 可以在 app/Exceptions/Handler.php 文件中执行。 有两种方法 :

    1. report: 如果要使用自定义格式记录异常。
    2. render: 如果要将自定义 HTTP 响应返回到该异常。

    在您的情况下 , 您需要自定义响应 :

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

    同样的东西也适用于您的 St时机相关异常 , 您可以在这个 Handler 类中处理它。 阅读有关 render 方法的更多信息。

    希望这能给你一些建议。

More articles:

  • 如何使用 common Trait 为所有模型在 laravel 实现雄辩的事件
  • 如何在 Laravel 授权中将数字传递给中间件
  • 如何在 laravel 中处理像刀片模板这样的字符串?
  • 拉拉威尔 4 - 如何显示和隐藏部件在刀片?
  • 如何通过具有函数的 laravel 的额外参数
  • Laravel 4, 如何防止 Eliquent 模型处理某些属性?
  • 我如何组织拉拉威尔 5 项目的课程 ?
  • 如何允许特殊人物在拉拉威尔路线 ?
  • 如何处理 laravel 中的迁移错误 ?
  • 如何通过目录定义拉拉威尔 5.0 路
  • 如何验证拉拉威尔 4 中两列的唯一性?
  • Laravel 最新 5.4 如何执行
  • 多处理、线程共享和线程池如何工作
  • 如何在瓶中处理回调数据
  • 我如何处理我的蜘蛛数据从我的主要脚本。
  • 例外财产[Id]不适用于此集合实例
  • Laravel 5: 贪吃 ->获得例外状态代码?
  • 如何在 ApacheWebserver 中使用 XSLT 处理 http 响应?
  • 如何将变量传递给拉勒维尔的工厂?
  • 如何在 R栏名称中处理美元符号
  • 如何使用 ASP.NET Web API 在 JavaScript 后端处理 JWT 客户端 _ id
  • 如何在 Laravel 5.2 中查看 url ?
  • 在批处理插入中 , 如何在一行中发生错误时继续插入其他行
  • 如何使用 node.js 处理从 ASP.NET WEB API 发送到 AWS Lambda 的 JSON 请求
  • 拉拉威尔更新数据库与用户问题?
  • 如何将 GCM 消息从 GcmListenerService 发送给相关处理程序?
  • 如何在 Laravel 5.5 + Vue.js + Axios 中使用复选框删除多个行
  • 如何在带有批处理脚本的注册表中添加两个值 ?
  • pyTelegramBotAPI 。 如何在下一个 _ 步 _ 处理程序解决方案中保存状态?
  • 如何正确地声明处理程序