第一部分:php artisan storage:link 是什么?

1. php artisan storage:link 就像玩具工厂的展示窗
  • 生活中的例子
    想象一下,你在一家玩具工厂工作。工厂里有一个储物间(storage),里面存放着所有的玩具。但顾客不能直接进入储物间查看玩具,你需要在商店的展示窗(public)中放一个指向储物间的指示牌,让顾客可以通过展示窗看到玩具。
  • 在编程里
    php artisan storage:link 的作用就是在 public 目录下创建一个符号链接(symlink),指向 storage/app/public 目录。这样,用户就可以通过浏览器访问存储在 storage 中的文件。

第二部分:php artisan storage:link 包含哪些部分?

1. 主要组成部分
  1. storage 目录
    • 存放上传的文件(如图片、文档等)。
  2. public 目录
    • Web 应用的入口目录,用户可以通过浏览器访问这里的文件。
  3. 符号链接(Symbolic Link)
    • 创建一个快捷方式,将 public/storage 链接到 storage/app/public
  4. 底层实现
    • 使用 PHP 的 symlink() 函数创建符号链接。

第三部分:背后到底做了哪些事情?

1. 核心思想
  • 安全性:将文件存放在 storage 目录中,避免直接暴露敏感文件。
  • 便捷性:通过符号链接,让用户可以通过 public 目录访问文件。
  • 灵活性:支持多种磁盘驱动(如本地存储、S3),方便扩展。
2. 底层实现
  • Laravel 使用 Illuminate\Filesystem\Filesystem 类创建符号链接。
  • 调用 PHP 的 symlink() 函数,生成从 public/storagestorage/app/public 的快捷方式。

第四部分:示例代码与详细讲解

1. 示例代码:如何使用 php artisan storage:link
问题:如何通过 php artisan storage:link 让用户访问上传的文件?
解决方案:创建符号链接并上传文件
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ToyController extends Controller {
    public function upload(Request $request) {
        // 验证文件是否上传成功
        if ($request->hasFile('toy_image') && $request->file('toy_image')->isValid()) {
            // 获取上传的文件
            $file = $request->file('toy_image');
            
            // 定义存储路径
            $path = $file->store('uploads/toys', 'public'); // 存储到 storage/app/public/uploads/toys
            
            // 返回文件路径
            return response()->json([
                'message' => '文件上传成功',
                'url' => asset('storage/' . $path) // 生成文件的访问 URL
            ]);
        }
        return response()->json(['error' => '文件上传失败'], 400);
    }
}

为什么要这样写?

  • $file->store('uploads/toys', 'public'):将文件存储到 storage/app/public/uploads/toys 目录。
  • asset('storage/' . $path):生成文件的访问 URL,storage 是符号链接的目标。

2. 如何运行 php artisan storage:link
php artisan storage:link

为什么要运行这条命令?

  • 这条命令会在 public 目录下创建一个名为 storage 的符号链接。
  • 符号链接指向 storage/app/public,使用户可以通过浏览器访问这些文件。

第五部分:底层原理

1. 符号链接的工作原理
  • 符号链接就像一个快捷方式,指向目标目录或文件。
  • 在 Linux 系统中,符号链接通过 ln -s 命令创建。
  • 在 Windows 系统中,符号链接通过 mklink 命令创建。
2. Laravel 的实现
  • Laravel 的 StorageLinkCommand 类负责执行 php artisan storage:link
  • 代码片段如下:
    use Illuminate\Filesystem\Filesystem;
    
    public function handle() {
        $filesystem = new Filesystem();
        $link = public_path('storage'); // public/storage
        $target = storage_path('app/public'); // storage/app/public
    
        if (file_exists($link)) {
            $this->error('The "public/storage" directory already exists.');
            return;
        }
    
        $this->laravel->make('files')->link($target, $link); // 创建符号链接
        $this->info('The [public/storage] directory has been linked.');
    }
    

为什么要这样写?

  • public_path('storage'):获取 public/storage 的绝对路径。
  • storage_path('app/public'):获取 storage/app/public 的绝对路径。
  • link($target, $link):调用 symlink() 函数创建符号链接。

第六部分:使用场景

1. 用户头像上传
  • 用户上传的头像存储在 storage/app/public 中。
  • 通过 public/storage 访问头像文件。
2. 文件管理系统
  • 上传的文件(如 PDF、图片)存储在 storage/app/public 中。
  • 通过 public/storage 提供下载链接。
3. 多媒体资源
  • 视频、音频等多媒体文件存储在 storage/app/public 中。
  • 通过 public/storage 提供播放链接。

第七部分:总结

1. php artisan storage:link 的本质
  • 安全性:将文件存放在 storage 目录中,避免直接暴露敏感文件。
  • 便捷性:通过符号链接,让用户可以通过 public 目录访问文件。
  • 灵活性:支持多种磁盘驱动(如本地存储、S3),方便扩展。
2. 生活中的类比
  • php artisan storage:link 就像在商店的展示窗中放一个指向储物间的指示牌,让顾客可以通过展示窗看到储物间的玩具。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐