fojuth/response-exception

Laravel4 的响应异常

1.1.0 2014-02-21 11:44 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:12:02 UTC


README

Laravel4 的响应异常是返回响应的异常。

安装说明

desmart/response-exception 添加到 composer.json 的需求中

{
  "require": {
    "desmart/response-exception": "1.1.*"
  }
}

使用 composer updatecomposer install 更新您的包。

要添加错误处理器,请将 'DeSmart\ResponseException\ResponseExceptionServiceProvider', 添加到 app/config/app.php 中的 providers。

添加处理器的另一种方法是向 app/filters.php 添加 App::error()

App::error(DeSmart\ResponseException\ErrorHandlerFactory::make());

请记住,要在添加其他 App::error() 处理器之后添加它 之后

为什么?

让我们看看 desmart/laravel-layout。这是一个调用许多动作的复杂控制器。

在其中一个动作中进行重定向非常痛苦。这是因为每个动作只返回 更大 响应的一部分。返回将覆盖 大部分 响应的唯一方法是抛出异常。

这不是最佳设计(异常不是为此而设计的!),但它有效,并有机会从应用程序的最小部分生成完整的响应。

用例

此包对于 标准 Laravel 应用程序来说毫无用处。它可能最适合与 desmart/laravel-layout 一起使用,因为它是一个恶作剧控制器。

此外,在某些边缘情况下,它可以在需要发送自己的响应进行控制器调度时使用应用程序的某些部分。

示例

use DeSmart\ResponseException\Exception as ResponseException;

ResponseException::make('foo'); // sends 'foo' response

// There's an option to make chained exceptions
ResponseException::chain(Redirect::to('/'))
  ->withInput()
  ->fire();

黑客攻击

Laravel 的响应可以在请求周期中的多个部分返回

  • 路由之前 (App::before())
  • 路由调度期间
  • 抛出异常时 (App::error)

我们的黑客攻击利用了 App::error()。当错误处理器返回一个值时,该值被视为响应并返回给客户端。

由于抛出异常会中断正常代码执行,这是快速传递响应的最佳方式。

但是有一个问题。每个异常都会记录到文件中。绕过它的唯一方法是注册错误处理器 作为最后一个。Laravel 将每个错误处理器放在处理器堆栈的顶部。当其中一个返回响应时,其他处理器将不会被调用。