تطبيق الإضافات

كل إضافة تطبيق هي تطبيق كامل، يتم وضع كود المصدر في دليل {المشروع الرئيسي}/plugin

تنبيه
باستخدام الأمر php webman app-plugin:create {اسم الإضافة} يمكنك إنشاء إضافة تطبيق محليًا،
على سبيل المثال php webman app-plugin:create cms سيقوم بإنشاء هيكل الدليل التالي

plugin/
└── cms
    ├── app
    │   ├── controller
    │   │   └── IndexController.php
    │   ├── exception
    │   │   └── Handler.php
    │   ├── functions.php
    │   ├── middleware
    │   ├── model
    │   └── view
    │       └── index
    │           └── index.html
    ├── config
    │   ├── app.php
    │   ├── autoload.php
    │   ├── container.php
    │   ├── database.php
    │   ├── exception.php
    │   ├── log.php
    │   ├── middleware.php
    │   ├── process.php
    │   ├── redis.php
    │   ├── route.php
    │   ├── static.php
    │   ├── thinkorm.php
    │   ├── translation.php
    │   └── view.php
    └── public

نرى أن لإضافة تطبيق نفس هيكل الدليل وملفات التكوين الخاصة بـ webman. في الواقع، تجربة تطوير إضافة تطبيق تشبه بشكل أساسي تلك الخاصة بمشروع webman، ما عليك سوى مراعاة النقاط التالية.

مساحة الأسماء

يجب أن تتبع أسماء الدلائل والإضافات معيار PSR4، نظرًا لأن الإضافات توضع في دليل plugin، فإن مساحات الأسماء تبدأ جميعها بـ plugin، على سبيل المثال plugin\cms\app\controller\UserController، حيث أن cms هو الدليل الرئيسي لكود المصدر للإضافة.

الوصول عبر URL

تبدأ مسارات عنوان URL لإضافة التطبيق بـ /app، على سبيل المثال، عنوان URL لـ plugin\cms\app\controller\UserController هو http://127.0.0.1:8787/app/cms/user.

الملفات الثابتة

تُخزن الملفات الثابتة في plugin/{الإضافة}/public، على سبيل المثال، الوصول إلى http://127.0.0.1:8787/app/cms/avatar.png في الواقع يسترجع الملف plugin/cms/public/avatar.png.

ملفات التكوين

تكوين الإضافات مشابه لتكوين مشروع webman العادي، لكن تكوين الإضافات عمومًا يؤثر فقط على الإضافة الحالية ولا يؤثر عادةً على المشروع الرئيسي.
على سبيل المثال، فإن قيمة plugin.cms.app.controller_suffix تؤثر فقط على لاحقة وحدة التحكم في الإضافة، وليس على المشروع الرئيسي.
مثال آخر هو أن قيمة plugin.cms.app.controller_reuse تؤثر فقط على ما إذا كانت الإضافة تعيد استخدام وحدة التحكم، ولا تؤثر على المشروع الرئيسي.
وهاكذا بالنسبة لبقية إعدادات الإضافة مثل plugin.cms.middleware، و plugin.cms.view، و plugin.cms.container، و plugin.cms.exception، إذ تؤثر جميعها فقط على الإضافة ولا تؤثر على المشروع الرئيسي.

ومع ذلك، نظرًا لأن التوجيه هو عالمي، فإن التوجيهات المكونة للإضافات تؤثر أيضًا على النظام العالمي.

الحصول على التكوين

للحصول على تكوين إحدى الإضافات، استخدم الطريقة config('plugin.{الإضافة}.{التكوين المحدد}');، على سبيل المثال للحصول على جميع إعدادات plugin/cms/config/app.php، استخدم config('plugin.cms.app').
وبالمثل، يمكن أن يستخدم المشروع الرئيسي أو إضافات أخرى config('plugin.cms.xxx') للحصول على تكوين إضافة cms.

إعدادات غير مدعومة

لا تدعم الإضافات إعدادات server.php و session.php، ولا تدعم إعدادات app.request_class و app.public_path و app.runtime_path.

قاعدة البيانات

يمكن للإضافات تكوين قاعدة بيانات خاصة بها، على سبيل المثال، محتوى plugin/cms/config/database.php هو كما يلي

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql هو اسم الاتصال
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'قاعدة البيانات',
            'username'    => 'اسم المستخدم',
            'password'    => 'كلمة المرور',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin هو اسم الاتصال
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'قاعدة البيانات',
            'username'    => 'اسم المستخدم',
            'password'    => 'كلمة المرور',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

طريقة الاقتباس هي Db::connection('plugin.{الإضافة}.{اسم الاتصال}');، على سبيل المثال

use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();

إذا كنت ترغب في استخدام قاعدة بيانات المشروع الرئيسي، فما عليك سوى استخدامها مباشرةً، على سبيل المثال

use support\Db;
Db::table('user')->first();
// افترض أن المشروع الرئيسي قد قام أيضًا بتكوين اتصال admin
Db::connection('admin')->table('admin')->first();

تنبيه
كذلك يمكن استخدام thinkorm بطريقة مشابهة

Redis

تشبه طريقة استخدام Redis طريقة استخدام قاعدة البيانات، على سبيل المثال plugin/cms/config/redis.php

return [
    'default' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 0,
    ],
    'cache' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 1,
    ],
];

عند الاستخدام

use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');

وبالمثل، إذا كنت ترغب في إعادة استخدام إعدادات Redis الخاصة بالمشروع الرئيسي

use support\Redis;
Redis::get('key');
// افترض أن المشروع الرئيسي قد قام أيضًا بتكوين اتصال cache
Redis::connection('cache')->get('key');

السجلات

طريقة استخدام فئة السجلات مشابهة لطريقة استخدام قاعدة البيانات

use support\Log;
Log::channel('plugin.admin.default')->info('test');

إذا كنت ترغب في إعادة استخدام إعدادات السجل الخاصة بالمشروع الرئيسي، فما عليك سوى استخدامها مباشرة

use support\Log;
Log::info('محتوى السجل');
// افترض أن المشروع الرئيسي لديه إعداد سجل يسمى test
Log::channel('test')->info('محتوى السجل');

تثبيت وإلغاء تثبيت الإضافات

كل ما عليك فعله لتثبيت إضافة هو نسخ دليل الإضافة إلى دليل {المشروع الرئيسي}/plugin، وستحتاج إلى reload أو restart لتفعيلها.
لإلغاء التثبيت، ما عليك سوى حذف دليل الإضافة المقابل من {المشروع الرئيسي}/plugin.