عملية إنشاء ونشر الإضافات الأساسية
المبدأ
- كمثال على إضافة cross-origin، تتكون الإضافة من ثلاثة أجزاء: ملف middleware لـ cross-origin، وملف الإعدادات
middleware.php، وملفInstall.phpالذي يُنشأ تلقائياً بالأمر. - نستخدم أمراً لتغليف هذه الملفات الثلاثة ونشرها عبر Composer.
- عند تثبيت المستخدم لإضافة cross-origin عبر Composer، ينسخ
Install.phpملف middleware والإعدادات إلى{المشروع الرئيسي}/config/pluginلتحميلها webman، لتفعيل إعداد cross-origin تلقائياً. - عند إزالة المستخدم للإضافة عبر Composer، يزيل
Install.phpملفات middleware والإعدادات المقابلة، لتحقيق إلغاء التثبيت التلقائي.
المواصفات
- اسم الإضافة من جزءين:
vendorواسم الإضافة، مثلwebman/push، بما يوافق اسم حزمة Composer. - ملفات إعداد الإضافة توضع في
config/plugin/vendor/اسم الإضافة/(أمر الـ console ينشئ مجلد الإعداد تلقائياً). إذا لم تحتج الإضافة إلى إعدادات، يُحذف المجلد المنشأ تلقائياً. - مجلد إعداد الإضافة يدعم فقط:
app.php(الإعداد الرئيسي)،bootstrap.php(تشغيل العمليات)،route.php(المسارات)،middleware.php(الوسيط)،process.php(عمليات مخصصة)،database.php(قاعدة البيانات)،redis.php(Redis)،thinkorm.php(thinkorm). هذه تُعرَف تلقائياً من webman. - الوصول للإعدادات:
config('plugin.vendor.اسم الإضافة.ملف الإعداد.المفتاح');، مثلconfig('plugin.webman.push.app.app_key'). - إذا كان للإضافة إعدادات قاعدة بيانات خاصة: لـ
illuminate/databaseاستخدمDb::connection('plugin.vendor.اسم الإضافة.الاتصال')، ولـthinkormاستخدمDb::connect('plugin.vendor.اسم الإضافة.الاتصال'). - إذا وُضعت ملفات أعمال في
app/، يجب تجنب التعارض مع المشروع الرئيسي أو الإضافات الأخرى. - ينبغي للإضافات تجنب نسخ ملفات أو مجلدات إلى المشروع الرئيسي. مثلاً في إضافة cross-origin يُنسخ الإعداد فقط؛ تبقى ملفات middleware في
vendor/webman/cros/src. - يُفضَّل استخدام PascalCase لأسماء مساحات الإضافة، مثل
Webman/Console.
مثال
تثبيت سطر الأوامر webman/console
composer require webman/console
إنشاء إضافة
افترض أن الإضافة المراد إنشاؤها تُسمى foo/admin (اسم مشروع Composer للنشر، بالأحرف الصغيرة). نفّذ:
php webman plugin:create --name=foo/admin
ينشأ vendor/foo/admin لملفات الإضافة وconfig/plugin/foo/admin للإعدادات.
ملاحظة
config/plugin/foo/adminيدعم:app.php,bootstrap.php,route.php,middleware.php,process.php,database.php,redis.php,thinkorm.php. نفس صيغة webman، دمج تلقائي.
الوصول باستخدام البادئةplugin، مثلconfig('plugin.foo.admin.app').
تصدير الإضافة
بعد انتهاء التطوير، نفّذ:
php webman plugin:export --name=foo/admin
تصدير
توضيح
التصدير ينسخconfig/plugin/foo/adminإلىvendor/foo/admin/srcوينشئInstall.phpالذي يُنفَّذ عند التثبيت والإزالة.
التثبيت الافتراضي: نسخ الإعداد منvendor/foo/admin/srcإلىconfig/pluginللمشروع.
الإزالة الافتراضية: حذف ملفات إعداد الإضافة منconfig/pluginللمشروع.
يمكن تعديلInstall.phpلإضافة منطق مخصص للتثبيت والإزالة.
إرسال الإضافة
- افترض أن لديك حساباً على GitHub وPackagist.
- أنشئ مستودعاً
adminعلى GitHub وارفع الكود، مثلhttps://github.com/اسم-المستخدم/admin. - ادخل إلى
https://github.com/اسم-المستخدم/admin/releases/newوأنشئ إصداراً، مثلv1.0.0. - على Packagist انقر
Submitوأرسلhttps://github.com/اسم-المستخدم/adminلنشر الإضافة.
نصيحة
في حال تعارض الاسم على Packagist، اختر vendor آخر، مثل تغييرfoo/adminإلىmyfoo/admin.
عند التحديثات: ارفع الكود إلى GitHub، أنشئ إصداراً جديداً على https://github.com/اسم-المستخدم/admin/releases/new، ثم انقر Update على https://packagist.org/packages/foo/admin.
إضافة أوامر للإضافة
بعض الإضافات تحتاج أوامر مخصصة. مثلاً عند تثبيت webman/redis-queue يكتسب المشروع أمر redis-queue:consumer. تنفيذ php webman redis-queue:consumer send-mail يولد بسرعة صنف consumer باسم SendMail.php، مما يسرّع التطوير.
لإضافة أمر foo-admin:add لإضافة foo/admin:
إنشاء أمر
إنشاء الملف vendor/foo/admin/src/FooAdminAddCommand.php
<?php
namespace Foo\Admin;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class FooAdminAddCommand extends Command
{
protected static $defaultName = 'foo-admin:add';
protected static $defaultDescription = 'وصف الأمر';
/**
* @return void
*/
protected function configure()
{
$this->addArgument('name', InputArgument::REQUIRED, 'Add name');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
$output->writeln("Admin add $name");
return self::SUCCESS;
}
}
ملاحظة
لتجنب تعارض الأوامر بين الإضافات، استخدم الصيغةvendor-plugin:أمر. مثلاً جميع أوامرfoo/adminيجب أن تبدأ بـfoo-admin:، مثلfoo-admin:add.
إضافة الإعداد
إنشاء config/plugin/foo/admin/command.php
<?php
use Foo\Admin\FooAdminAddCommand;
return [
FooAdminAddCommand::class,
// إضافة المزيد عند الحاجة...
];
نصيحة
command.phpيسجل الأوامر المخصصة للإضافة. كل عنصر صنف أمر.webman/consoleيحمّلها تلقائياً. راجع أوامر الـ console.
تنفيذ التصدير
نفّذ php webman plugin:export --name=foo/admin لتصدير الإضافة ونشرها على Packagist. بعد تثبيت foo/admin يصبح أمر foo-admin:add متاحاً. تنفيذ php webman foo-admin:add jerry يطبع Admin add jerry.