最近发表的话题
最近发表的评论
  • 微信小程序版博客开发汇总(附源码) at 2个月前

    @Reason_bobo 已经在 github 开源了

  • Laravel-Vue-SSR-SPA 服务端渲染 / 单页面渲染实现骨架 at 2个月前

    @symeny 数据怎么渲染出来的?php执行js应该是需要用到v8js吧,如果真的是使用v8js的话性能确实不怎么样

  • (译)别再使用 JWT 作为 Session 系统!问题重重且很危险。 at 2个月前

    @史沟飞 我觉得可以在服务器用缓存把jti存储起来,验证的时候在比对一下jti就可以了

  • dingo/API 文档翻译 at 2个月前

    @liyu001989 嗯,昨天就关注了

  • dingo/API 文档翻译 at 2个月前

    想着把项目升级到laravel5.8,结果 dingo/api 会报错 :confused:

  • 从 Git 拽下来的代码不能运行?如何解决? at 2个月前

    运行 composer install 没?

  • Laravel 5.8 前瞻 at 2个月前

    @leo 我也这么觉得,之前我想要缓存6s钟都是要转换成小数

  • maatwebsite/Excel 处理导入 Excel 文件, phpfpm 内存飙升, 有没有解决办法。 at 2个月前

    @anziguoer csv 自己写个方法实现更方便

    function export_csv($filename, $data, $columns = [], $chunk = 1000000)
    {
        if (!$columns) {
            $firstRow = $data instanceof Generator ? $data->current() : current($data);
    
            if (!$firstRow) {
                exit;
            }
    
            foreach ($firstRow AS $key => $value) {
                $columns[] = [
                    'title' => $key,
                    'index' => $key,
                ];
            }
        }
    
        header('Content-Type: application/csv; charset=UTF-8');
        header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
        header('Cache-Control: max-age=0');
    
        $storageDir = rtrim(sys_get_temp_dir(), '/');
        $prefix = str_random(10);
    
        $fileList = []; // 文件集合
        $fileList[] = $file = "$storageDir/${prefix}_${filename}_1.csv";
    
        $fp = fopen($file, 'w');
        fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
        $head = array_pluck($columns, 'title');
        fputcsv($fp, $head);
    
        // 计数器
        $i = 0;
        // 每隔$limit行刷新一下输出buffer,不要太大,也不要太小
        $limit = 10000;
        // 行上限
        $maxLimit = 100000000;
    
        foreach ($data as $item) {
            if ($i >= $maxLimit) {
                break;
            }
    
            if ($i > 0 && $i % $chunk == 0) {
                fclose($fp);  // 关闭上一个文件
                $j = $i / $chunk + 1;
                $fileList[] = $file = "$storageDir/${prefix}_${filename}_$j.csv";
    
                $fp = fopen($file, 'w');
                fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
                fputcsv($fp, $head);
            }
    
            $i++;
    
            if ($i % $limit == 0) {
                ob_flush();
                flush();
            }
    
            $row = [];
    
            foreach ($columns AS $column) {
                $value = isset($column['index'])
                        ? (is_object($item) ? $item->{$column['index']} : $item[$column['index']])
                        : null;
                $render = array_get($column, 'render');
                if ($render && $render instanceof Closure) {
                    $row[] = $render($value, $item);
                } else {
                    if (is_numeric($value) && strlen($value) > 10) {
                        $value .= "\t";
                    }
                    $row[] = $value;
                }
            }
    
            fputcsv($fp, $row);
            unset($row);
        }
    
        fclose($fp);
    
        if (count($fileList) > 1) {
            $zip = new ZipArchive();
            $oldFilename = $filename;
            $filename = "$storageDir/${prefix}_${filename}.zip";
            $zip->open($filename, ZipArchive::CREATE); // 打开压缩包
    
            foreach ($fileList as $file) {
                $zip->addFile($file, str_replace("${prefix}_", '', basename($file)));   // 向压缩包中添加文件
            }
            $zip->close(); // 关闭压缩包
    
            foreach ($fileList as $file) {
                @unlink($file); // 删除csv临时文件
            }
    
            // 输出压缩文件提供下载
            header("Cache-Control: max-age=0");
            header("Content-Description: File Transfer");
            header('Content-disposition: attachment; filename=' . $oldFilename . '.zip');
            header("Content-Type: application/zip"); // zip格式的
            header("Content-Transfer-Encoding: binary");
            header('Content-Length: ' . filesize($filename));
        } else {
            $filename = head($fileList);
        }
    
        @readfile($filename);
        @unlink($filename); // 删除临时文件
    
        exit;
    }
    
    $sql = "SELECT * FROM users";
    $users = DB::cursor($sql);
    $columns = [
        [
            'title' => '用户ID',
            'index' => 'id',
        ],
        [
            'title' => '用户名称',
            'index' => 'name',
        ],
        [
            'title' => '电子邮箱',
            'index' => 'email',
        ],
        [
            'title' => '注册日期',
            'index' => 'created_at',
            'render' => function ($createdAt, $item) {
                return substr($createdAt, 0, 10);
            }
        ],
    ];
    
    export_csv('用户列表', $users, $columns);
  • maatwebsite/Excel 处理导入 Excel 文件, phpfpm 内存飙升, 有没有解决办法。 at 2个月前

    用csv吧

  • 本节课中的 data 对象中的 include 属性是否可以省略了呢 at 2个月前

    小程序?

  • 请教一个关于中间件的问题 at 3个月前

    @早起的虫子 controller 构造函数会先于路由 middleware 执行,因为 laravel 需要先获取 controllerMiddleware 然后和 路由 middleware 合并

  • 请教一个关于中间件的问题 at 3个月前

    因为 laravel 获取路由 middleware 的时候会同时获取 controllerMiddleware 然后合并,这里获取 controllerMiddleware 时需要实例化 controller,所以会造成 controller 构造函数会先于路由 middleware 执行

  • 老师,请问 Laravel-china 的 Markdown 的方案是用的哪个啊?我觉得还挺好看的 at 3个月前

    编辑器:SimpleMDE
    解析器:erusev/parsedownlaravel 自带)
    代码高亮:prismjs,主题:okaidia

    我之前做了个 blog 也是用的这个方案,有兴趣可以去看一下

  • 请问 DingoApi 的 Transformer 怎么返回自定义状态码?比如我要在 Transformer 中添加一个 status_code at 3个月前
    • 可以通过 setMeta 来实现
    return $this->response->item($this->user(),new UserTransformer)->setMeta(['status_code' => 200]);
    • 你还可以配合自定义 serializer 来调整响应结构

    新建 app/Serializers/DataSerializer.php 文件

    <?php
    
    namespace App\Serializers;
    
    use League\Fractal\Serializer\ArraySerializer;
    use League\Fractal\Pagination\PaginatorInterface;
    
    class DataSerializer extends ArraySerializer
    {
    
        public function collection($resourceKey, array $data)
        {
            return compact('data');
        }
    
        public function item($resourceKey, array $data)
        {
            return compact('data');
        }
    
        public function meta(array $meta)
        {
            return $meta;
        }
    
        public function paginator(PaginatorInterface $paginator)
        {
            $pagination = [
                'total' => (int)$paginator->getTotal(),
                'current' => (int)$paginator->getCurrentPage(),
                'pageSize' => (int)$paginator->getPerPage(),
            ];
    
            return compact('pagination');
        }
    
        public function mergeIncludes($transformedData, $includedData)
        {
            if (!$this->sideloadIncludes()) {
                foreach ($includedData as $identifier => $data) {
                    $key = snake_case($identifier);
                    $includedData[$key] = current($data);
                    if ($key != $identifier) {
                        unset($includedData[$identifier]);
                    }
                }
                $transformedData = array_merge($transformedData, $includedData);
            }
            return $transformedData;
        }
    
    }

    然后编辑 app/Providers/AppServiceProvider.php 文件

    ...
    public function boot()
    {
        $this->app->make(\Dingo\Api\Transformer\Factory::class)
            ->setAdapter(function () {
                return new \Dingo\Api\Transformer\Adapter\Fractal((new \League\Fractal\Manager)->setSerializer(new \App\Serializers\DataSerializer));
            });
    }
    • 如果你是想将http状态码转换为 status_code 响应,那么你可以通过中间件来实现
    public function handle(Request $request, Closure $next)
    {
        try {
            $response = $next($request);
            if ($response instanceof \Illuminate\Http\Response) {
                if ($response->exception instanceof \Exception) {
                    throw $response->exception;
                }
    
                $content = $response->getOriginalContent();
    
                if (is_array($content)) {
                    if (!array_has($content, 'status_code')) {
                        $content['status_code'] = $response->getStatusCode() * 100;
                    }
                    if (!array_has($content, 'message')) {
                        $content['message'] = '成功!';
                    }
                    $response->setContent($content);
                }
            }
            return $response;
        } catch (\Exception $exception) {
            $code = ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface) ? $exception->getStatusCode() : 500;
            return new \Illuminate\Http\JsonResponse([
                'data' => [
                    'message' => $exception->getMessage(),
                ],
                'message' => $exception->getMessage(),
                'status_code' => (int)($code * 100),
            ]);
        }
    
    }
  • React SimpleMDE Markdown Editor at 4个月前

    @zhangzijian markdown 图片就是这种格式的,你可以点击预览看效果。
    还有 jsonFieldName 这个字段得根据你 uploadUrl 响应的数据结构来设置

  • PHP 百万级数据导出方案(多 CSV 文件压缩) at 7个月前

    @iven-token 游标不会的

  • Laravel at 7个月前

    DB::statement('sql')

  • request 获取请求参数时字段尾部的空格或者回车获取不到? at 7个月前

    编辑 app/Http/Kernel.php 文件,去掉 \App\Http\Middleware\TrimStrings::class, 中间件,或者编辑 app/Http/Middleware/TrimStrings.php 文件,在 $except 属性里面添加排除字段就可以了。

  • 如何权衡 Blade 和 VueJS ? at 7个月前

    如果不考虑 seo 的话,我是更倾向于前后分离,这样开发效率高而且代码结构也比较清晰

  • PHP fastcgi 端口配置为 9000 为何不行? at 7个月前

    @phpero 你是不是没开启 nginx 错误日志?