laravel-admin使用swoole(laravel-s)后如何处理导出

image.png

在index(index所在类的完整代码)中添加如下代码:

        if (config('admin.swoole') && request(Exporter::$queryName)) {
            $grid = $this->grid();
            return $grid->handleExportRequest(true);
        }

需要修改laravel-admin的handleExportRequest方法如下:

    /**
     * Handle export request.
     * 
     * 要用pulic方法,因为兼容swoole,需要外部调用
     *
     * @param bool $forceExport
     */
    public function handleExportRequest($forceExport = false)
    {
        if (!$scope = request(Exporter::$queryName)) {
            return;
        }

        // clear output buffer.
        if (ob_get_length()) {
            ob_end_clean();
        }

        $this->disablePagination();

        if ($this->builder) {
            //要加这几行,不然没有过滤器无效了
            call_user_func($this->builder, $this);
        
            return $this->getExporter($scope)->export();
        }

        if ($forceExport) {
            return $this->getExporter($scope)->export();
        }
    }

因为我是引入自己修改过的laravel-admin,所以直接修改的源码,如果你是引入原库的话,可以通过反射的方式直接在调用的地方写handleExportRequest方法中的内容。

  1. 然后要自己定义一个导出处理类,核心是不用exit()和用response()->streamDownload()参考:
    https://github.com/never615/laravel-admin-enhance/blob/master/src/Grid/Exporters/CsvExporter.php

PS. 话说可以的话管理端可以单独做一个项目,不用swoole,一般来说管理端的访问量没有那么大吧。