You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel的FilesystemAdapter宏中获取指定磁盘并生成CDN URL

解决Laravel Storage宏中获取指定磁盘名称的问题

问题描述

我想在Laravel中创建一个Macro,用来返回指定Storage::disk的CDN URL。但当前宏里用getDriver()拿到的是League\Flysystem\Filesystem对象,无法获取调用时指定的磁盘名称(比如local、public)。现有宏代码如下:

<?php

namespace App\Providers;

use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;

class StorageMacroServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        if (!function_exists('cdnUrl'))
        {
            FilesystemAdapter::macro('cdnUrl', function ($filename) {
                $diskName = $this->getDriver();
                dd($diskName);
                return Storage::disk($diskName)->url($filename);
            });
        }
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

调用方式:

Storage::disk('local')->cdnUrl('test');

解决方案

Illuminate\Filesystem\FilesystemAdapter类本身提供了getDiskName()方法,可以直接获取当前磁盘的名称。而且当前的$this就是你调用时指定的磁盘实例,不需要再通过Storage::disk()重新获取,直接调用其url()方法即可。修改后的宏代码如下:

<?php

namespace App\Providers;

use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\ServiceProvider;

class StorageMacroServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        if (!FilesystemAdapter::hasMacro('cdnUrl')) {
            FilesystemAdapter::macro('cdnUrl', function ($filename) {
                // 获取当前磁盘名称(业务需要时可保留)
                $diskName = $this->getDiskName();
                
                // 直接返回当前磁盘的CDN URL
                return $this->url($filename);
            });
        }
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

补充说明

  1. 用FilesystemAdapter::hasMacro('cdnUrl')替代function_exists('cdnUrl'),因为宏是注册在类上的,不是全局函数,判断逻辑更准确。
  2. 磁盘的CDN URL依赖于config/filesystems.php中的配置,比如public磁盘的配置示例:
'public' => [
    'driver' => 'local',
    'root' => storage_path('app/public'),
    'url' => env('APP_URL').'/storage',
    'visibility' => 'public',
],

如果是云存储磁盘(如S3),配置好对应CDN域名后,url()方法会自动返回CDN地址。

内容的提问来源于stack exchange,提问作者birbhouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:17:00