【问题标题】:Laravel s3 Storage: undefined method 'url'Laravel s3存储:未定义的方法'url'
【发布时间】:2020-04-27 20:58:36
【问题描述】:

我是使用 amazon s3 和 laravel 的初学者,在调用 url() 方法从 s3 文件中检索完整 url 时遇到问题。

我在 Laravel 版本 5.8.29 并为 s3 安装适当的作曲家包

我正在测试将文件上传到存储桶后检索 url。上传成功。

use Illuminate\Support\Facades\Storage;

$url = Storage::url('file.jpg');

$url = Storage::disk('s3')->url('image.png');

使用 Storage::url('file.jpg') 没问题,但是

使用 Storage::disk('s3')->url('image.png') 我会收到一条错误消息“未定义的方法'url'”,即使它在 laravel 官方文档中,我也不确定为什么。

【问题讨论】:

标签: laravel amazon-s3 storage


【解决方案1】:

我也被这个“错误”困扰。 VSCode 和 Intelephense 一直对任何 Storage::disk('s3')->url('path.ext');Undefined method 'url',即使知道这是 Laravel docs File Storage 上建议的方法。对于特定于 5.8 的文档,look here

显然,有不止一种方法可以处理这个问题,我不确定在不改变 Laravel 本身的情况下选择哪种方法是正确的。我会告诉你我认为最好的方法,至少对我而言,因为我正在尝试解决同样的问题。

一些建议的方法是:

  • 使用默认的云文件系统like this

    Storage::cloud()->url('filename.ext');
    

    但我承认我不喜欢它,因为我更喜欢指定磁盘名称。请记住,要使用它,您将在config/filesystems.php 定义cloud 配置,如下所示:'cloud' => env('FILESYSTEM_CLOUD', 's3')。但是,如果我们可以通过 cloud 方法学到一些东西,那就是它在读取代码时向 IDE 返回了正确的类型(我们将使用它)。

  • 根据上面的cloud方法,返回\Illuminate\Filesystem\FilesystemManager。因此,我们可以使用它在变量注释中指定它,如下所示:

    /** @var \Illuminate\Filesystem\FilesystemManager $disk */
    $disk = Storage::disk('s3');
    $url = $disk->url('filename.ext');
    

    Greg 提到了here。我真的很喜欢这个实现,我可能会使用它。请记住,您也可以始终创建一个方法在任何地方返回该方法以避免重复代码:

    /**
     * Return the s3 storage disk.
     *
     * @return \Illuminate\Filesystem\FilesystemAdapter 
     */
    private function getDisk()
    {
        return Storage::disk('s3');
    }
    
  • 另一种稳健的方法是直接使用 Laravel 在表格下使用的一些隐藏方法来生成 url:
    $s3 = Storage::disk('s3')->getAdapter()->getClient();
    $url = $s3->getObjectUrl(env('AWS_BUCKET'), 'filename.ext');
    
    即使不必在配置中设置文件系统url,这也可能会生成 url,但正如人们评论的那样,它可能不适用于非公共 s3 目录。据我测试,如果您在配置中设置了url,它只会不考虑它。就个人而言,毕竟这些原因,我不喜欢这样。
  • 还有另一种方式,比如扩展外观,但我也不喜欢,我宁愿不在这里发布它,首先因为它对于一些琐碎的事情来说代码太多了,其次不推荐它。但是,当然,如果您想以集中的方式处理这个问题,那也许就是这条路。

如您所见,现在更快捷、更简洁的方法是使用@var 表示法

希望有人在不久的将来解决此问题,或者出现另一种更好的方法。如果有人知道更好的东西,请在 cmets 中告诉我,我很乐意在这里更新。

相关信息:

如果这有帮助,请记住考虑接受答案或点赞。

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多