如何在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() { // } }
补充说明
- 用
FilesystemAdapter::hasMacro('cdnUrl')替代function_exists('cdnUrl'),因为宏是注册在类上的,不是全局函数,判断逻辑更准确。 - 磁盘的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
相关产品推荐
相关产品推荐

