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.1 | 3.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.