ファイルストレージ
Doggy のファイルストレージシステムは League Flysystem に基づいて構築され、ローカルストレージと S3 互換ストレージをサポートします。ファイルアップロード、画像最適化、URL 生成などの機能を提供します。
概要
ストレージシステムは src/Service/Storage/ にあります:
src/Service/Storage/
├── StorageManager.php # 存储管理器(适配器选择)
├── FileUploadService.php # 文件上传服务
├── FileUrlGenerator.php # URL 生成/缓存
├── ImageOptimizerService.php # 图片优化(Imagine 库)
└── Adapter/
├── StorageAdapterInterface.php
├── LocalStorageAdapter.php
└── S3StorageAdapter.php関連エンティティは src/Entity/Storage/:
| エンティティ | 説明 |
|---|---|
File.php | ファイルレコード |
StorageConfig.php | ストレージ設定(アダプタータイプ、パラメータ、CDN ドメイン) |
UploadSession.php | アップロードセッション |
ストレージバックエンド
| バックエンド | アダプター | 適用シナリオ |
|---|---|---|
| Local | LocalStorageAdapter | 開発環境、小規模デプロイ |
| AWS S3 | S3StorageAdapter | クラウドデプロイ(CDN ドメイン対応) |
ローカルストレージ
php
// 默认本地存储:public/uploads/
$adapter = new LocalStorageAdapter(
rootPath: '/var/www/public/uploads',
publicUrl: '/uploads'
);S3 ストレージ
php
// S3 兼容存储(支持 AWS、MinIO、阿里云 OSS 等)
$adapter = new S3StorageAdapter([
'access_key' => '...',
'secret_key' => '...',
'region' => 'us-east-1',
'bucket' => 'doggy-files',
'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com',
'cdn_domain' => 'https://cdn.example.com',
]);ファイルアップロード
FileUploadService は完全なアップロードフローを提供します:
php
$file = $fileUploadService->upload($uploadedFile, [
'disk' => 'default',
'optimize' => true,
'max_size' => 52428800, // 50MB
]);アップロードフロー:
FileUploadingEventをディスパッチ(オプションをインターセプトして変更可能)- ファイルセキュリティチェック(タイプ、サイズ、拡張子、MIME)
- SHA-256 ハッシュによる重複排除
- 日付ポリシーに基づいて保存パスを生成(
Y/m/uuid.extまたはuuid.ext) - アダプターにアップロード
- File エンティティを作成
FileUploadedEventをディスパッチ- 非同期の画像圧縮メッセージ(
ImageCompressMessage)
画像最適化
ImageOptimizerService は Imagine ライブラリに基づきます:
php
$optimizer->optimize($sourcePath, $targetPath, [
'max_width' => 1920,
'max_height' => 1080,
'quality' => 80,
'format' => 'webp',
]);URL 生成
FileUrlGenerator はキャッシュと一時 URL をサポートします:
php
$url = $urlGenerator->getUrl($file); // 带缓存
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // 签名 URL
$urlGenerator->invalidateUrl($file); // 清除缓存管理画面
入口: App\Controller\Admin\StorageConfigController
テンプレート: templates/admin/storage/