yii2 - 如何让 Yii2 响应不同的 HTTP 响应?将在库中创建。

标签 yii2 httpresponse tcpdf fpdf

我正在使用 FPDF/TCPDF 和 Yii2。这两个库(以及其他库)都可以直接将数据发送到客户端。所以 Yii2 响应是没有必要的。它甚至必须被关闭。我怎样才能做到这一点?

目前,我收到以下错误,该错误可以在创建的 PDF 文件的末尾找到(使用文本编辑器):

yii\web\HeadersAlreadySentException: Headers already sent in /var/www/html/production-service/vendor/setasign/fpdf/fpdf.php on line 1017. in /var/www/html/my-app/vendor/yiisoft/yii2/web/Response.php:378

使用以下代码:

class MyController extends yii\web\Controller {
    public function actionCreatePdf() {
        $pdf = new FPDF();
        ...
        $pdf->Output('D', 'my.pdf');
    }
}

最佳答案

使用Response::$isSent属性(property)不可靠。只要一切正常,它就可以工作。但是,如果您在响应生成过程中遇到异常(例如FPDF可能抛出异常),您将再次获得HeadersAlreadySentException,因为错误处理程序会重置响应对象并再次发送它。据我所知,唯一的解决方案是创建不发送任何内容的转储响应对象,并将其设置为响应组件:

class DumbResponse extends \yii\web\Response {

    public function send() {
    }
}

在 Controller 操作中:

public function actionCreatePdf() {
    Yii::$app->setComponents([
        'response' => DumbResponse::class
    ]);

    $pdf = new FPDF();
    // ...
    $pdf->Output('D', 'my.pdf');
}

关于yii2 - 如何让 Yii2 响应不同的 HTTP 响应?将在库中创建。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023586/

相关文章:

mysql - MYSQL 中的过滤和连接表

node.js - 我如何使用 yii2 和 redis 进行订阅?

php - 在字符串上调用成员函数redirect() - Yii2 v2.0.36

twitter-bootstrap - 如何使用 yii 2.0 Bootstrap 轮播?

asp.net-web-api - ASP.NET WebAPI : How to control string content returned to client?

web-services - 解释 : The underlying connection was closed: The connection was closed unexpectedly

Java从json属性解压缩HTTP GZIP内容

php - 在 Laravel 中扩展 TCPDF 类

php fatal error :调用未定义的方法 TCPDF::addTTFfont()

php - TCPDF_import 没有引入现有文件