تخزين الملفات
يعتمد نظام تخزين الملفات في 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 التخزين المؤقت والعناوين المؤقتة:
php
$url = $urlGenerator->getUrl($file); // 带缓存
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // 签名 URL
$urlGenerator->invalidateUrl($file); // 清除缓存واجهة الإدارة
نقطة الدخول: App\Controller\Admin\StorageConfigController
القالب: templates/admin/storage/