Menu
flag Ar iconالعربيةdown icon

Composer في PHP: تثبيت الحزم والتحميل التلقائي للأصناف

Composer هو مدير الحزم في PHP: ينزّل composer require vendor/package مكتبة إلى vendor/، ويسجلها في composer.json، وتحمّلها require 'vendor/autoload.php'. تعلّم تثبيت Composer، وcomposer.json، وقيود الإصدارات، وinstall مقابل update، والتحميل التلقائي PSR-4 لأصنافك.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

Composer هو مدير الحزم في PHP. شغّل composer require vendor/package في مجلد مشروعك: ينزّل Composer المكتبة إلى vendor/، ويسجلها في composer.json، وتحمّلها، مع كل ما ثبّته غيرها، بسطر واحد، require __DIR__ . '/vendor/autoload.php';.

composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);

لا include لكل ملف: يحمّل المحمّل التلقائي Logger وStreamHandler وكل ما يستخدمانه أول مرة يُحتاج فيها إلى كل صنف. وتأتي الحزم من Packagist، السجل العام الذي يبحث فيه Composer افتراضيًا.

تثبيت Composer

يحتاج Composer إلى PHP على جهازك أولًا (راجع تثبيت PHP).

Windows: نزّل Composer-Setup.exe من getcomposer.org وشغّله. يجد ملف php.exe الخاص بك ويضيف composer إلى PATH. افتح طرفية جديدة بعد ذلك.

macOS مع Homebrew:

brew install composer

Linux: تعمل حزمة توزيعتك (sudo apt install composer على Debian وUbuntu) لكنها كثيرًا ما تكون إصدارًا أقدم. ويعطي المثبّت الرسمي الإصدار الحالي:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

تعرض صفحة التنزيل في getcomposer.org أيضًا سطرًا يتحقق من تجزئة المثبّت قبل تشغيله؛ انسخ الأوامر من هناك لتحصل على التجزئة الحالية. ثم تحقق من أنه يعمل:

composer --version

composer.json وcomposer.lock

يطرح composer init بضعة أسئلة ويكتب composer.json، أو ينشئه composer require مع أول حزمة. وهذا ملف نموذجي:

{
    "name": "acme/shop",
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.0",
        "vlucas/phpdotenv": "^5.6"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
  • يسرد require ما يحتاجه المشروع ليعمل، بما فيه إصدار PHP.
  • يسرد require-dev أدوات التطوير فقط (الاختبارات، والتحليل الساكن). يضيف إليه composer require --dev phpunit/phpunit، ويتخطاه composer install --no-dev على خوادم الإنتاج.
  • يخبر autoload الأداة Composer أين تعيش أصنافك (أدناه).

وبجانبه، يكتب Composer الملف composer.lock بالإصدار الدقيق لكل حزمة ثبّتها، بما في ذلك الحزم التي تعتمد عليها حزمك. ارفع الملفين كليهما. ولا ترفع vendor/: أضفه إلى .gitignore، لأن composer install يعيد بناءه من ملف القفل.

composer install مقابل composer update

composer install          # install exactly what composer.lock says
composer update           # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog   # update one package only
composer remove monolog/monolog   # uninstall and remove from composer.json
composer outdated         # list packages with newer versions available

شغّل composer install بعد استنساخ مشروع وفي كل عملية نشر: يحصل الجميع على الإصدارات نفسها التي اختُبرت. ولا تشغّل composer update إلا حين تنوي الترقية، ثم اختبر وارفع composer.lock الجديد. وتشغيل update على خادم إنتاج يثبّت إصدارات لم يختبرها أحد.

قيود الإصدارات: ^ و~

القيديسمح بـاستخدمه لـ
^3.2من 3.2.0 حتى 4.0.0 دون تضمينهالخيار العادي: ميزات وإصلاحات، دون إصدار رئيسي كاسر
^0.4من 0.4.0 حتى 0.5.0 دون تضمينهالحزم قبل 1.0، حيث قد تكسر الإصدارات الفرعية
~3.2من 3.2.0 حتى 4.0.0 دون تضمينهمثل ^3.2
~3.2.1من 3.2.1 حتى 3.3.0 دون تضمينهالإصلاحات فقط
3.2.13.2.1 بالضبطنادرًا؛ فهو يمنع الإصلاحات الأمنية
>=3.2 <3.5نطاق مخصصالالتفاف على إصدار معطوب

يختار composer require vendor/package دون إصدار أحدث إصدار مستقر ويكتب له قيد ^، وهذا عادة ما تريده.

التحميل التلقائي لأصنافك بـ PSR-4

PSR-4 هو الاصطلاح الذي يربط فضاء أسماء بمجلد: مع "App\\": "src/"، يعيش الصنف App\Text\Slug في src/Text/Slug.php. وبعد إضافة قسم autoload، شغّل:

composer dump-autoload

المحمّل التلقائي في Composer دالة مسجلة بـ spl_autoload_register()، تستدعيها PHP كلما استخدمت الشيفرة صنفًا لم يُحمَّل بعد. تكتب هذه الكتلة ملفي صنفين وتسجّل محمّلًا تلقائيًا صغيرًا خاصًا بها بأسلوب PSR-4، لتشاهد الربط وهو يعمل. أضف ملف صنف ثالثًا واستخدمه.

يعمل المحمّل التلقائي مرة واحدة لكل صنف: لا يطبع استدعاء Slug::from() الثاني أي سطر autoload:، لأن الصنف محمّل أصلًا. وفي مشروع حقيقي لا تكتب هذه الدالة بنفسك أبدًا؛ يسجّل vendor/autoload.php نسخة Composer، التي تتعامل أيضًا مع الحزم في vendor/. وفضاءات الأسماء مشروحة في صفحة فضاءات الأسماء.

أخطاء شائعة

  • Class "Monolog\Logger" not found. لم ينفّذ السكربت require 'vendor/autoload.php'، أو المسار خاطئ. استخدم __DIR__ . '/vendor/autoload.php' حتى لا يعتمد المسار على المجلد الحالي.
  • صنفك لا يُعثر عليه بعد إضافته إلى autoload. شغّل composer dump-autoload، وتحقق من أن مسار الملف يطابق فضاء الأسماء تمامًا، بما في ذلك الأحرف الكبيرة والصغيرة: يجب أن يكون App\Text\Slug في src/Text/Slug.php، وتعامل خوادم Linux الملف src/text/slug.php على أنه ملف مختلف.
  • Your requirements could not be resolved to an installable set of packages. حزمتان تحتاجان إلى إصدارين غير متوافقين من شيء ما، كثيرًا ما يكون PHP نفسها. تسرد الرسالة التعارض؛ ويشرح composer why-not vendor/package 2.0 ما يمنع إصدارًا.
  • composer غير معروف. فُتحت الطرفية قبل التثبيت، أو المجلد ليس في PATH. افتح طرفية جديدة، أو استدعِ php composer.phar مباشرة.

الأسئلة الشائعة

ما الفرق بين composer install وcomposer update؟

يثبّت composer install الإصدارات المسجلة في composer.lock بالضبط، فيحصل كل جهاز على الشيفرة نفسها؛ شغّله بعد الاستنساخ وعند النشر. ويحل composer update أحدث الإصدارات التي يسمح بها composer.json، ويثبّتها ويعيد كتابة composer.lock؛ شغّله حين تقصد الترقية.

هل أرفع composer.lock ومجلد vendor إلى المستودع؟

ارفع composer.lock للتطبيقات، ليثبّت الجميع الإصدارات نفسها. ولا ترفع vendor/: أضفه إلى .gitignore ودع composer install يعيد إنشاءه.

ماذا تعني ^ في composer.json؟

تسمح ^2.3 بأي إصدار من 2.3.0 حتى 3.0.0 دون تضمينه: ميزات وإصلاحات جديدة، لكن دون إصدار رئيسي جديد قد يكسر شيفرتك. وتعني ~2.3 الشيء نفسه، ولا تسمح ~2.3.1 إلا بـ 2.3.x بدءًا من 2.3.1.

كيف أحمّل أصنافي تلقائيًا باستخدام Composer؟

أضف "autoload": {"psr-4": {"App\\": "src/"}} إلى composer.json، وشغّل composer dump-autoload، وrequire 'vendor/autoload.php'. عندها يُحمَّل الصنف App\Mail\Mailer من src/Mail/Mailer.php أول مرة تستخدمه فيها.

كيف أعرف إصدار Composer المثبّت؟

شغّل composer --version. ولترقية Composer نفسه، شغّل composer self-update، أو رقّه عبر مدير الحزم الذي ثبّته به، مثل brew upgrade composer.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن