DcatAdmin 七牛云存储之前端文件直传(继续优化)

接上一篇,我们已经实现了浏览器将文件直传七牛云,但是在控制器中引入相关代码,冗长且繁琐。

于是,我今天抽空把前面那段代码优化了一下,原理是利用 Laravel 框架的 Macro 功能,为 Dcat\Admin\Form\Field\File 类添加一个名为 qiniu 方法。

打开 app/Admin/bootstrap.php 文件,添加如下代码...

分类至 PHP
0条评论

DcatAdmin 七牛云存储之前端文件直传

接上一篇,已知 DcatAdmin 配置了七牛云存储后,可以不改动原来的表单代码,就能将资源上传到七牛云存储空间,如:

$form->image('img_url')
    ->uniqueName()
    ->autoUpload()
    ->saveFullUrl()
    ->autoSave(false)
    ->removable(false);

这样使用,图片上传的时候,是先经过我们的服务器,然后再由服务器上传到七牛云,相当于做了一次中转。

图片文件一般都比较小,前端页面上传操作感觉不出有什么变化。但如果是一些大文件,比如视频文件,几十MB甚至几百MB,前端操作上传的时候,就会明显看到进度条到100%后仍要等待一段时间,最后才显示完成,体验非常不好!

分类至 PHP
0条评论

DcatAdmin 让七牛云存储默认返回 https 的资源链接

DcatAdmin 图片/文件上传说明:https://learnku.com/docs/dcat-admin/2.x/picture-file-upload/8106#5e550f

我根据文档中的说明配置了七牛云,但在使用了 saveFullUrl 方法后,发现返回的资源链接是 http 而非 https。

阅读了扩展包源码,目前在 app/Providers/AppServiceProvider.php 文件的 boot 方法中添加两行代码得以解决:

    public function boot()
    {
        // 七牛云设置默认url为https
        $domain = config('filesystems.disks.qiniu.domains.https');
        Storage::disk('qiniu')->getAdapter()->setDomainPrefix('https://'.$domain, 'default');
    }

 

分类至 PHP
0条评论

laravel 数据迁移文件给表添加注释

当还在用 laravel 8.x 的时候,在 migration 数据迁移文件中,给 mysql 表添加注释,需要增加一条 DB::statment( ) 语句:

DB::statement("alter table `test` comment '表注释'");

当你升级到 laravel 9.14.0 版本后,就不需要这样做了,可使用 $table->comment( ) 语句,如...

分类至 MySQL
0条评论

Lumen 框架前后台认证(多用户认证)

Lumen 框架默认只有一种角色认证(单表),但是通常我们会把后台管理员与前台用户设计成两个不同的表,这个时候就得改造一下代码了。

假设后台管理员和前台用户对应 Model 分别为 App\Models\AdminApp\Models\User,作如下修改...

分类至 PHP
0条评论

Laravel 框架查询数据集转换为数组

1. Eloquent 查询

在 Laravel 框架里,如果是 Eloquent 查询,可以用 toArray 方法的把结果转换为一维数组。

Eloquent 模型的 first 方法返回的是单个 Eloquent 对象,使用 toArray 方法可以把它转换成数组:

$user = User::where('id', 1)->first()->toArray();

Eloquent 模型的 get 方法返回的是包含多个 Eloquent 对象的 Collection 集合,使用 toArray 方法可以把集合转换成二维数组:

$users = User::whereIn('id', [1, 2, 3])->get()->toArray();

2. DB 查询

当我们使用 DB 类进行查询时,first 方法返回的是 stdClass 对象,get 方法返回的是包含多个 stdClass 对象的 Collection 集合。

// first 返回结果是 stdClass 对象
$user = DB::table('users')->where('id', 1)->frist();

// get 返回结果是包含多个 stdClass 对象的 Collection 集合
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();

stdClass 是 PHP 的标准对象,当然不能使用 toArray 方法转换成数组。而 Collection 的 toArray 方法代码实现如下:

// 摘自框架文件:vendor\laravel\framework\src\Illuminate\Support\Collection.php
public function toArray()
{
    return array_map(function ($value) {
        return $value instanceof Arrayable ? $value->toArray() : $value;
    }, $this->items);
}

它通过判断集合内元素是否实现了 Arrayable 接口,再调用元素自身的 toArray 方法转换成数组——刚好 Eloquent 实现了这个接口。而 stdClass 对象当然就没有这个方法,因此,DB 查询 get 方法返回的 Collection 集合,用 toArray 方法转换成数组时,仅能转换第一层,内部元素还是 stdClass 对象。

解决方法一:

// first 结果转换成一维数组
$user = DB::table('users')->where('id', 1)->frist();
$user = (array)$user;

// get 结果转换成二维数组
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();
$users = $users->map(function ($value) { return (array)$value; })->toArray();

解决方法二:

// first 结果转换成一维数组
$user = DB::table('users')->where('id', 1)->frist();
$user = json_decode(json_encode($user), true);

// get 结果转换为成二维数组
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();
$users = json_decode(json_encode($users), true);

 

分类至 PHP
0条评论