吃不上鱼的dj猫

明月如镜 高悬草原映照千年岁月


  • 首页

  • 技术

  • 感想

  • 笔记

  • 归档

  • 关于

  • 搜索
close

Laravel FileSystem源码分析

时间: 2022-06-26   |   分类: technical     |   阅读: 1204 字 ~3分钟

Facade 入手

Laravel Facade模式实现方式是:所有的Facade(比如Storage)都需要继承虚拟类Facade。虚拟类Facade提供了一个__callStatic方法,来承接所有的方法调用。

该方法提供的作用包括:

  • 获取具体Facade对应的实例。子类实现的getFacadeAccessor方法提供
  • 调用实例对应方法。__callStatic方法参数提供。

而Storage Facade对应的实例是FilesystemManager对象,是通过FilesystemServiceProvider注册到容器里面的。

适配器

Laravel在多处地方使用到适配器,比如 database, auth, filesystem。不同适配器都会对应一个Manager后缀的管理器,比如FilesystemManager对应着filesystem。

管理器主要功能:

  • 创建不同的driver
  • 注册新driver
  • 获取driver

Storage通过调用disk(或drive、cloud对应配置filesystems.cloud),获取(如果不存在创建)对应driver实例。

如果想实现自己的driver,可以通过FilesystemManager的extend方法,比如你想使用aliyun oss云存储,那么可以

$this->app->make('filesystem')->extend('aliyun', function ($app, array $config) {
               // 返回根据config创建的实例即可
});

如果返回的实例实现了League\Flysystem\FilesystemInterface接口,那么就使用FilesystemAdapter统一包装一下,如果没有,直接返回driver实例,给调用方。而所谓的包装,大部分作用是为了和laravel本身的调用接口进行统一,做了一层代理转发。如果driver本身实例存在FilesystemAdapter没有的方法,还是会溯源调用driver方法。

如果想实现自己的driver,那这里的driver对应的不应该是aliyun官方client实例,而应该实现自己的adapter做一层适配。

调用举例

本身存在方法 getTemporaryUrl

  1. Storage Facade调用disk方法,获取到driver实例
  2. driver实例满足FilesystemInterface,被FilesystemAdapter包装
  3. FilesystemAdapter中的方法temporaryUrl,接受调用
  4. 调用driver本身的getTemporaryUrl的方法。

调用driver本身方法

  1. Storage Facade调用disk方法,获取到driver实例
  2. driver实例满足FilesystemInterface,被FilesystemAdapter包装
  3. FilesystemAdapter中的方法__call,接受调用
  4. 调用driver本身的方法。

总结

Facade找到Manager实例,Manager创建driver,并调用driver对应的方法。Manager同时负责扩展driver,用Adapter包装driver,来统一调用接口。

#laravel#
Laravel 消息队列源码分析
在Kubernetes上搭建私有PyPi仓库
  • 文章目录
  • 站点概览
D&J

D&J

程序员

27 日志
3 分类
17 标签
GitHub
    • Facade 入手
    • 适配器
    • 调用举例
    • 总结
© 2009 - 2024 吃不上鱼的dj猫
Powered by - Hugo v0.124.0
Theme by - NexT 沪ICP备14008426号-3
0%