ما هو Flysystem ولماذا تحتاجه؟
Flysystem هي مكتبة PHP قوية توفر واجهة موحدة للتعامل مع أنظمة الملفات المختلفة. طورها Frank de Jonge لحل مشكلة أساسية: في المشاريع الحقيقية، غالبًا ما يكون الكود مرتبطًا بنظام ملفات محدد (قرص محلي، FTP، Amazon S3، Dropbox، إلخ). إذا احتجت غدًا لنقل تخزين الملفات من الخادم المحلي إلى التخزين السحابي، فسيتعين عليك إعادة كتابة جزء كبير من الكود.
يقوم Flysystem بتجريد هذا التعقيد. تكتب الكود مرة واحدة باستخدام API موحد، ويمكنك تغيير "المحول" (برنامج التشغيل) لنظام الملفات دون تعديل منطق الأعمال في تطبيقك. هذا يجعل كودك:
- مرنًا — سهولة التبديل بين أنظمة التخزين.
- قابلًا للاختبار — يمكن استخدام نظام ملفات "وهمي" في الاختبارات.
- قابلًا للنقل — يعمل الكود بنفس الطريقة على بيئات مختلفة.
تُستخدم هذه المكتبة في مشاريع معروفة مثل Laravel (كأساس لقرص التخزين)، Symfony، Drupal، وغيرها الكثير. يدعم Flysystem عشرات المحولات: Local، FTP/SFTP، Amazon S3، Google Cloud Storage، Azure Blob Storage، WebDAV، Dropbox، وحتى الأرشيفات المشفرة وملفات Zip.
طريقة التثبيت
يتم تثبيت Flysystem عبر Composer. للعمل الأساسي مع نظام الملفات المحلي، يكفي حزمتان:
composer require league/flysystem
composer require league/flysystem-local
هام: بدءًا من الإصدار 3.x، يستخدم Flysystem بنية معيارية. الحزمة الأساسية league/flysystem تحتوي فقط على الواجهات والفئات الأساسية. يتم تثبيت المحولات (برامج التشغيل) بشكل منفصل. هذا يسمح لك بتثبيت ما تحتاجه فقط.
لأنظمة الملفات الأخرى:
composer require league/flysystem-ftp— لـ FTP/SFTPcomposer require league/flysystem-aws-s3-v3— لـ Amazon S3composer require league/flysystem-google-cloud-storage— لـ Google Cloudcomposer require league/flysystem-memory— للاختبارات (نظام ملفات افتراضي في الذاكرة)
بداية سريعة
لننشئ مثالًا بسيطًا: كتابة وقراءة وحذف ملف على القرص المحلي.
<?php
require 'vendor/autoload.php';
use League\Flysystem\Filesystem;
use League\Flysystem\Local\LocalFilesystemAdapter;
// 1. إنشاء محول لنظام الملفات المحلي
// تحديد المجلد الجذر حيث سيتم تخزين الملفات
$adapter = new LocalFilesystemAdapter(__DIR__ . '/storage');
// 2. إنشاء كائن Filesystem
$filesystem = new Filesystem($adapter);
// 3. كتابة ملف
$filesystem->write('hello.txt', 'مرحبًا بالعالم!');
// 4. قراءة الملف
$content = $filesystem->read('hello.txt');
echo $content; // سيطبع: مرحبًا بالعالم!
// 5. التحقق من وجود الملف
if ($filesystem->fileExists('hello.txt')) {
echo "الملف موجود!";
}
// 6. حذف الملف
$filesystem->delete('hello.txt');
// 7. التحقق من أن الملف لم يعد موجودًا
echo $filesystem->fileExists('hello.txt') ? 'موجود' : 'غير موجود'; // سيطبع: غير موجود
?>
لاحظ أننا لا نستخدم file_put_contents() أو fopen() أو أي دوال PHP أصلية أخرى. كل الكود يعمل من خلال الواجهة الموحدة Filesystem.
الطرق/الدوال الأساسية
دعنا نستعرض الطرق الرئيسية في Flysystem. جميع الأمثلة تفترض أن لديك كائن $filesystem جاهزًا.
1. write() — كتابة ملف جديد
الوظيفة: إنشاء ملف جديد أو استبدال ملف موجود.
المعاملات:
string $path— مسار الملفstring|resource $contents— محتوى الملف (نص أو مصدر)array $config— إعدادات اختيارية (مثل