[译]Laravel 5.0 之云存储驱动

本文译自 Matt Stauffer系列文章.


在 Laravel 5.0 版本中, FileSystem 类不再只是与本地文件系统进行交互, 而是可以用于 S3 和 Rackspace 的存储 API, 但使用方法很简单. 这是基于 Frank de JongeFlysystem 实现的一个简单的接口.

这意味着开发者可以像从前操作本地文件存储那样编写代码:

/**
 * 存储 Thing 到文件中
 *
 * @param Thing  $thing
 * @param string $filename
 */
public function saveThing(Thing $thing, $filename)
{
    File::put('uploads/' . $filename, $thing);
}

在 Laravel 5.0 中, 可以随时通过修改生产环境下的应用配置文件, 无缝切换到外部的云存储服务(目前仅支持 S3 和 Rackspace, 本文以 S3 为例), 无需对上面的代码做任何修改.

从本地存储切换到 S3 服务.

首先, 需要在 composer.json 文件中添加云服务提供商的依赖项. 以 S3 为例, 依赖项是 AWS SDK(aws\aws-sdk-php).

$ composer require aws\aws-sdk-php

然后, 修改 config/filesystems.php 文件中的配置(或者只修改 config/production/filesystems.php 文件, 这样只在生产环境下生效). 把默认的文件存储驱动从 local 改成 s3, 并加上你的 S3 认证信息.

return [
    'default' => 's3',
    'disks'   => [
        'driver' => 's3',
        'key'    => 'fslkfqweoirqew',
        'secret' => '24j12oin12oi5nio251',
        'bucket' => 'my-awesome-website-bucket'
    ]
];

云端默认值 vs. 常规默认值

Filesystem 的配置中有两组默认值: 文件系统默认值(当你用 Illuminate\Contracts\Filesystem\Filesystem 来做类型约束时注入)会同时绑定到一个名为 filesystem.disk 的容器, 以及 云存储默认值(当你用 Illuminate\Contracts\Filesystem\Cloud 做类型约束时注入), 它会同时绑定到一个名为 filesystem.cloud 的容器. 这样你可以给任何特定的环境都指定默认的本地配置及默认的云存储配置.

假如使用 facade 的话, 默认会返回 default 默认值, 而不是 cloud 默认值.

提示

  • 可以在多个运行环境以及多个不同的 buckets 使用相同的认证信息; 也可以使用不同的认证信息. 甚至可以在不同运行环境下使用不同的存储驱动. 完全取决于你.
  • 所有常用的 File 的方法在新的驱动下都可以使用, 比如 put, get 等等.
  • 如果在 controllers 之外的任何地方进行文件读写, 记得注入 Filesystem Contract(Illuminate\Contracts\Filesystem\Filesystem), 而不是以前的 facade.
  • Jeffrey Way 演示了如何在代码中而不是配置文件中指定要注入 Filesystem 工厂使用的驱动, 但我并没有详细了解这个技巧. 你可以通过 Multiple Filesystems 这个视频教程了解具体的情况.

写在最后

Once you’ve installed the AWS SDK and edited filesystems.php, all of your file operations are now happening against your s3 account. That’s it! No extra work, no extra steps: you’re up and running, storing and accessing files in the cloud like a pro. Way to go.

只要装上 AWS SDK 并编辑 filesystem.php 文件, 你原本基于本地存储实现的文件操作就可以直接应用于 S3 云存储. 就这么简单! 不需要任何额外的工作, 不需要任何额外的步骤, 你的应用就可以执行, 存储和访问云端的文件了. 试试吧!