我在Yii2上使用FPDF / TCPDF。两个库(以及其他库)都可以直接将数据发送到客户端。所以Yii2的反应是没有必要的。它甚至必须关闭。我怎么能这样做?
目前我收到以下错误,可以在创建的PDF文件的末尾找到(使用文本编辑器):
yii \ web \ HeadersAlreadySentException:已在/ var / www / html / my-app / vendor中的/var/www/html/production-service/vendor/setasign/fpdf/fpdf.php上发送了标题。 /yiisoft/yii2/web/Response.php:378
使用以下代码:
class MyController extends yii\web\Controller {
public function actionCreatePdf() {
$pdf = new FPDF();
...
$pdf->Output('D', 'my.pdf');
}
}
答案 0 :(得分:1)
要取消整个Yii2响应,您只需执行此操作:
public function actionCreatePdf() {
$pdf = new FPDF();
...
$pdf->Output('D', 'my.pdf');
Yii::$app->response->isSent = true; // <-------------
}
isSent
设置为true将阻止Yii2向客户端发送任何内容(标头,cookie)以执行给定操作。请注意,这也会取消response events - 但不会取消其他人application events,controller events)。
如果属性设置较晚(在操作结束时),则可以定期向客户端发送前面的异常(内容,标题,cookie不会被抑制)。
答案 1 :(得分:1)
使用Response::$isSent
属性并不可靠。只要一切正常,它就可以工作。但是如果在响应生成期间遇到异常(例如1
可能抛出异常),则会再次获得FPDF
,因为错误处理程序会重置响应对象并再次发送它。我所知道的唯一防弹解决方案是创建不发送任何内容的转储响应对象,并设置为HeadersAlreadySentException
组件:
response
在控制器动作中:
class DumbResponse extends \yii\web\Response {
public function send() {
}
}