اگر در حال یادگیری PHP هستید و قصد دارید وارد توسعه پروژههای حرفهای شوید، دیر یا زود با Composer مواجه خواهید شد.
Composer یکی از مهمترین ابزارهای اکوسیستم PHP است که برای مدیریت Packageها و Dependencyهای پروژه استفاده میشود. Frameworkهایی مانند Laravel نیز برای مدیریت وابستگیهای خود به Composer متکی هستند.
در مقاله قبلی با مفهوم Composer و کاربرد آن در PHP آشنا شدیم. در این مقاله میخواهیم وارد بخش عملی شویم و از نصب Composer گرفته تا ایجاد پروژه، نصب Package، حذف Package، مدیریت نسخهها، کار با composer.json و composer.lock و Autoload را مرحلهبهمرحله بررسی کنیم.
در پایان این آموزش میتوانید Composer را در پروژههای PHP خود به شکل حرفهایتری استفاده کنید.
# Composer چیست؟
Composer یک ابزار مدیریت Dependency برای زبان PHP است.
فرض کنید پروژه شما به چند کتابخانه مختلف نیاز دارد:
Project
├── HTTP Client
├── Logger
├── PDF Library
├── Testing Library
└── Database Library
مدیریت دستی این کتابخانهها کار سادهای نیست.
Composer این Dependencyها را مدیریت میکند و امکان نصب، حذف و بهروزرسانی آنها را در اختیار شما قرار میدهد.
برای مثال:
composer require monolog/monolog
با این دستور Package موردنظر به پروژه اضافه میشود.
اگر با مفهوم Composer آشنا نیستید، پیشنهاد میکنیم ابتدا مقاله Composer چیست؟ را مطالعه کنید و سپس این آموزش عملی را ادامه دهید.
# پیشنیازهای نصب Composer
قبل از نصب Composer باید PHP روی سیستم شما نصب باشد.
برای بررسی نصب بودن PHP، در Terminal یا Command Prompt اجرا کنید:
php -v
اگر PHP به درستی نصب شده باشد، نسخه PHP نمایش داده میشود.
مثلاً:
PHP 8.x.x
اگر دستور php شناخته نشد، احتمالاً PHP در PATH سیستم قرار نگرفته است.
# نصب Composer در ویندوز
برای نصب Composer در Windows معمولاً میتوانید از Installer رسمی Composer استفاده کنید.
پس از نصب، Terminal جدیدی باز کنید و دستور زیر را اجرا کنید:
composer -V
یا:
composer --version
اگر نصب موفقیتآمیز باشد، نسخه Composer نمایش داده میشود.
مثلاً:
Composer version 2.x.x
# نصب Composer در Ubuntu و Linux
در سیستمهای Linux میتوانید Composer را از Installer رسمی آن نصب کنید.
ابتدا مطمئن شوید PHP و ابزارهای موردنیاز نصب هستند.
سپس Installer را دریافت کنید:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
بعد از دریافت Installer میتوانید Composer را نصب کنید.
برای نصب عمومی روی سیستم، معمولاً Composer در مسیری مانند زیر قرار میگیرد:
/usr/local/bin/composer
پس از نصب:
composer --version
را اجرا کنید.
> در Serverهای Production بهتر است نصب Composer را مطابق سیاست و محدودیتهای همان Server انجام دهید.
# بررسی نسخه Composer
برای مشاهده نسخه نصبشده:
composer --version
یا:
composer -V
استفاده کنید.
برای مثال:
Composer version 2.x.x
نمایش داده میشود.
# ساخت اولین پروژه PHP با Composer
برای شروع یک پروژه ساده، یک پوشه ایجاد کنید:
mkdir my-project
سپس وارد آن شوید:
cd my-project
حالا:
composer init
را اجرا کنید.
Composer از شما اطلاعات مختلفی درباره پروژه میپرسد و در نهایت فایل:
composer.json
را ایجاد میکند.
# composer.json چیست؟
فایل composer.json قلب Dependency Management پروژه است.
یک نمونه ساده:
{
"name": "example/my-project",
"description": "My PHP project",
"require": {}
}
در این فایل میتوانیم Dependencyهای پروژه را تعریف کنیم.
مثلاً:
{
"require": {
"monolog/monolog": "^3.0"
}
}
در این حالت پروژه به Package مربوط به Monolog نیاز دارد.
# نصب اولین Package با Composer
یکی از سادهترین روشهای کار با Composer استفاده از دستور:
composer require
است.
مثلاً:
composer require monolog/monolog
Composer Package را دانلود کرده و Dependencyهای لازم آن را نیز بررسی و نصب میکند.
بعد از اجرای دستور، فایل composer.json نیز بهروزرسانی میشود.
# Composer چه فایلهایی ایجاد میکند؟
بعد از نصب Package معمولاً ساختاری مشابه زیر خواهید داشت:
my-project/
├── vendor/
├── composer.json
└── composer.lock
پوشه vendor محل Dependencyهای نصبشده است.
composer.json Dependencyهای پروژه را تعریف میکند.
و composer.lock نسخههای انتخابشده Dependencyها را ثبت میکند.
# پوشه vendor چیست؟
پوشه:
vendor/
محل قرارگیری Packageهای نصبشده توسط Composer است.
برای مثال:
vendor/
├── composer/
├── monolog/
└── psr/
Dependencyهای اصلی و Dependencyهای غیرمستقیم در این ساختار قرار میگیرند.
# آیا vendor را در Git قرار دهیم؟
در بیشتر پروژههای PHP معمولاً vendor/ داخل Git قرار نمیگیرد.
در .gitignore:
/vendor/
قرار داده میشود.
در عوض:
composer.json
composer.lock
در Repository ذخیره میشوند.
بعد از Clone کردن پروژه روی سیستم دیگر میتوان اجرا کرد:
composer install
تا Dependencyها نصب شوند.
# دستور composer install
یکی از مهمترین دستورات Composer:
composer install
است.
این دستور Dependencyهای پروژه را نصب میکند.
اگر composer.lock وجود داشته باشد، Composer از نسخههای مشخصشده در آن استفاده میکند.
این موضوع برای Deployment بسیار مهم است.
برای مثال در پروژه Production میتوان از:
composer install --no-dev --optimize-autoloader
استفاده کرد.
# دستور composer update
برای بهروزرسانی Dependencyها:
composer update
استفاده میشود.
این دستور Dependencyها را بر اساس Constraintهای موجود در composer.json مجدداً بررسی میکند و در صورت امکان نسخههای جدید را انتخاب میکند.
همچنین composer.lock را بهروزرسانی میکند.
نکته مهم
روی Production نباید بدون دلیل از:
composer update
استفاده کنید.
برای Deployment معمولاً:
composer install
انتخاب مناسبتری است.
# تفاوت composer install و composer update
این دو دستور را با یکدیگر اشتباه نگیرید.
| دستور | کاربرد |
|---|---|
composer install | نصب Dependencyهای پروژه |
composer update | بهروزرسانی Dependencyها و Lock File |
composer require | اضافه کردن Package جدید |
composer remove | حذف Package |
composer dump-autoload | بازسازی Autoloader |
composer show | نمایش Packageهای نصبشده |
# حذف Package با composer remove
اگر دیگر به Package خاصی نیاز ندارید:
composer remove monolog/monolog
را اجرا کنید.
Composer Package را حذف کرده و composer.json و composer.lock را نیز بهروزرسانی میکند.
# نصب Package فقط برای Development
اگر Package فقط در محیط Development موردنیاز است، میتوان آن را با:
composer require --dev phpunit/phpunit
نصب کرد.
در این حالت Dependency در بخش:
{
"require-dev": {
"phpunit/phpunit": "..."
}
}
قرار میگیرد.
# require و require-dev
دو بخش مهم composer.json عبارتاند از:
{
"require": {},
"require-dev": {}
}
Dependencyهای Runtime در:
require
و Dependencyهای Development در:
require-dev
قرار میگیرند.
برای مثال ابزار تست معمولاً Dependency مربوط به Development است.
# نصب بدون Dependencyهای Development
در Production میتوان Dependencyهای Development را نصب نکرد:
composer install --no-dev
این کار باعث میشود Packageهای بخش require-dev نصب نشوند.
# composer.lock چیست؟
فایل:
composer.lock
نسخه دقیق Dependencyهای انتخابشده پروژه را ثبت میکند.
برای مثال ممکن است پروژه در composer.json بگوید:
{
"require": {
"vendor/package": "^2.0"
}
}
اما Composer در زمان نصب یک نسخه مشخص را انتخاب کند.
این نسخه دقیق در composer.lock ثبت میشود.
# چرا composer.lock مهم است؟
فرض کنید پروژه روی سیستم شما به درستی کار میکند.
اگر فقط composer.json را به سیستم دیگری منتقل کنید، ممکن است Composer نسخه متفاوتی از برخی Dependencyها را انتخاب کند.
اما وقتی composer.lock نیز همراه پروژه باشد، Dependency Resolution قابل پیشبینیتر میشود.
به همین دلیل در Applicationهای واقعی معمولاً composer.lock اهمیت زیادی دارد.
# نصب Package با نسخه مشخص
میتوان نسخه Package را نیز مشخص کرد.
مثلاً:
composer require monolog/monolog:^3.0
یا Constraint مناسب پروژه را در composer.json قرار داد.
مثلاً:
{
"require": {
"monolog/monolog": "^3.0"
}
}
# Version Constraint در Composer
Composer از Constraintهای مختلفی برای مدیریت نسخه استفاده میکند.
نمونههایی مانند:
^3.0
~3.0
>=3.0
>3.0
<4.0
3.2.1
را ممکن است در پروژهها مشاهده کنید.
مفهوم دقیق هر Constraint مهم است، زیرا انتخاب نسخه Dependency را تحت تأثیر قرار میدهد.
# مشاهده Packageهای نصبشده
برای مشاهده Dependencyهای نصبشده:
composer show
را اجرا کنید.
این دستور اطلاعات Packageهای پروژه را نمایش میدهد.
برای مشاهده اطلاعات یک Package مشخص نیز میتوانید نام Package را به دستور بدهید.
# جستجوی Package
در اکوسیستم Composer Packageهای بسیار زیادی وجود دارند.
برای پیدا کردن Package مناسب میتوانید از Repositoryهای عمومی Composer مانند Packagist استفاده کنید.
هنگام انتخاب Package فقط به تعداد دانلود توجه نکنید.
مواردی مانند:
- آخرین نسخه
- وضعیت نگهداری
- Compatibility
- تعداد Issueهای باز
- مستندات
- License
- وابستگیها
- فعالیت Repository
را نیز بررسی کنید.
# composer dump-autoload چیست؟
Composer برای مدیریت Autoload فایلهایی تولید میکند.
اگر تنظیمات Autoload را تغییر دهید، میتوانید اجرا کنید:
composer dump-autoload
این دستور Autoloader را مجدداً تولید میکند.
در پروژههای Production نیز میتوان Autoload را Optimize کرد:
composer dump-autoload -o
یا:
composer dump-autoload --optimize
# تعریف Autoload با PSR-4
فرض کنید ساختار پروژه ما این باشد:
my-project/
├── src/
│ ├── Models/
│ │ └── User.php
│ └── Services/
│ └── UserService.php
├── composer.json
└── vendor/
در composer.json میتوانیم بنویسیم:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
بعد:
composer dump-autoload
را اجرا میکنیم.
اکنون Namespace:
App\Models
میتواند به مسیر:
src/Models/
Mapping شود.
# استفاده از vendor/autoload.php
بعد از نصب Dependencyها، Composer فایل Autoload ایجاد میکند.
در پروژه PHP میتوانیم:
require __DIR__ . '/vendor/autoload.php';
را اجرا کنیم.
بعد از آن امکان استفاده از کلاسهایی که توسط Composer مدیریت میشوند فراهم میشود.
مثلاً:
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
$log = new Logger('app');
در اینجا نیازی نیست فایل کلاس Monolog را به صورت دستی require کنیم.
# Autoload در Composer چگونه کار میکند؟
به صورت ساده:
composer.json
↓
autoload configuration
↓
composer dump-autoload
↓
vendor/autoload.php
↓
PHP Application
↓
Automatic Class Loading
Composer بر اساس تنظیمات Autoload میتواند کلاسها را در زمان نیاز پیدا و Load کند.
# Composer Scripts چیست؟
Composer امکان تعریف Script نیز دارد.
مثلاً:
{
"scripts": {
"test": "phpunit"
}
}
بعد میتوان اجرا کرد:
composer test
این قابلیت برای Automation در پروژهها بسیار کاربردی است.
میتوان Scriptهایی برای:
- تست
- Code Style
- Static Analysis
- Build
- Deployment
تعریف کرد.
# بررسی مشکلات Dependency
گاهی Composer نمیتواند Dependency موردنظر را نصب کند.
در چنین شرایطی بررسی علت Conflict بسیار مهم است.
دستورات:
composer why
و:
composer why-not
میتوانند برای پیدا کردن علت Dependency Conflict مفید باشند.
مثلاً اگر یک Package به نسخه خاصی از یک Library نیاز داشته باشد، این دستورات میتوانند در تحلیل Dependency Graph کمک کنند.
# خطای رایج: ناسازگاری نسخه PHP
یکی از خطاهای رایج Composer این است که Package موردنظر با نسخه PHP سیستم سازگار نیست.
مثلاً یک Package ممکن است حداقل به PHP نسخه خاصی نیاز داشته باشد.
برای بررسی نسخه PHP:
php -v
را اجرا کنید.
همچنین Composer هنگام Dependency Resolution محدودیتهای Platform را بررسی میکند.
بنابراین اگر Composer خطایی مربوط به PHP Version نمایش داد، ابتدا نسخه PHP CLI را بررسی کنید.
# خطای رایج: composer command not found
اگر بعد از نصب Composer با:
composer
خطایی مانند:
command not found
دریافت کردید، احتمالاً Composer در PATH سیستم قرار نگرفته است.
در Linux میتوانید مسیر Composer را بررسی کنید.
همچنین مطمئن شوید Terminal را بعد از تغییر PATH مجدداً باز کردهاید.
# خطای رایج: Memory Limit
برخی پروژههای بزرگ هنگام اجرای Composer ممکن است Memory زیادی مصرف کنند.
در چنین شرایطی ابتدا باید علت مصرف بالا مشخص شود.
افزایش Memory Limit ممکن است در بعضی محیطها کمک کند، اما بهتر است قبل از تغییر محدودیتها، Dependencyها و شرایط اجرای Composer بررسی شوند.
# Composer در پروژه Laravel
اگر با Laravel کار میکنید، Composer بخش مهمی از Workflow شما خواهد بود.
بعد از دریافت یک پروژه Laravel از Git معمولاً یکی از اولین دستورات:
composer install
است.
برای اضافه کردن Package نیز معمولاً:
composer require vendor/package
استفاده میشود.
مثلاً:
composer require laravel/sanctum
پس از نصب Package، در صورت نیاز مراحل Configuration و Migration مربوط به همان Package را نیز انجام میدهید.
# Composer در Deployment
یک Workflow ساده برای Deployment پروژه PHP میتواند شبیه این باشد:
git pull
composer install --no-dev --optimize-autoloader
اما در پروژههای واقعی ممکن است مراحل دیگری نیز وجود داشته باشد.
برای مثال:
Git Pull
↓
Composer Install
↓
Database Migration
↓
Cache Clear / Build
↓
Application Restart
دستورات دقیق باید بر اساس Framework و معماری پروژه تعیین شوند.
# بهترین روش استفاده از Composer در پروژههای حرفهای
برای استفاده بهتر از Composer نکات زیر را رعایت کنید:
۱. Dependencyهای غیرضروری اضافه نکنید
هر Package جدید یک Dependency جدید به پروژه اضافه میکند.
۲. وضعیت Package را بررسی کنید
قبل از نصب یک Package، کیفیت و وضعیت نگهداری آن را بررسی کنید.
۳. composer.lock را جدی بگیرید
برای Applicationهایی که Deployment دارند، Lock File اهمیت زیادی دارد.
۴. روی Production بیدلیل update نکنید
معمولاً Dependencyهای تستشده را با composer install نصب کنید.
۵. require-dev را برای ابزارهای Development استفاده کنید
ابزارهایی مانند Testing و Static Analysis معمولاً نیازی در Runtime ندارند.
۶. Dependencyها را مرتب بررسی کنید
Packageهای قدیمی یا بدون نگهداری میتوانند ریسک امنیتی و فنی ایجاد کنند.
۷. Autoload را بشناسید
در پروژههای حرفهای PHP، درک PSR-4 و Autoload بسیار مهم است.
# دستورات مهم Composer
در جدول زیر مهمترین دستورات این آموزش را یکجا میبینید:
| دستور | کاربرد |
|---|---|
composer -V | مشاهده نسخه Composer |
composer init | ایجاد composer.json |
composer require package | نصب Package |
composer require --dev package | نصب Development Package |
composer remove package | حذف Package |
composer install | نصب Dependencyها |
composer update | بهروزرسانی Dependencyها |
composer show | نمایش Packageها |
composer dump-autoload | بازسازی Autoload |
composer dump-autoload -o | Optimize کردن Autoload |
composer why | بررسی علت وجود Dependency |
composer why-not | بررسی علت عدم امکان نصب نسخه |
# یک مثال کامل از پروژه PHP با Composer
فرض کنید میخواهیم پروژهای بسازیم که از Monolog استفاده میکند.
ابتدا:
mkdir php-composer-demo
cd php-composer-demo
سپس:
composer init
بعد:
composer require monolog/monolog
ساختار پروژه:
php-composer-demo/
├── vendor/
├── composer.json
└── composer.lock
حالا یک فایل:
index.php
ایجاد کنید.
محتوای آن:
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(
new StreamHandler(__DIR__ . '/app.log')
);
$log->info('Application started');
echo 'Log created successfully.';
حالا:
php index.php
را اجرا کنید.
Composer Autoloader کلاسهای موردنیاز را مدیریت میکند و برنامه میتواند از Package نصبشده استفاده کند.
# Composer و مدیریت حرفهای Dependency
وقتی تعداد Packageهای پروژه افزایش پیدا میکند، اهمیت Composer بیشتر میشود.
برای مثال یک پروژه واقعی ممکن است Dependencyهایی مانند:
Framework
HTTP Client
Logger
Database Library
Cache Library
Testing Framework
Static Analyzer
داشته باشد.
Composer کمک میکند این وابستگیها قابل مدیریت و قابل تکرار باشند.
اما نکته مهم این است که Dependency بیشتر همیشه به معنی پروژه بهتر نیست.
هر Package جدید باید بر اساس نیاز واقعی پروژه اضافه شود.
# جمعبندی آموزش Composer
در این آموزش یاد گرفتیم که چگونه Composer را در پروژههای PHP استفاده کنیم.
مهمترین مواردی که یاد گرفتیم عبارتاند از:
- نصب Composer
- بررسی نسخه Composer
- ساخت
composer.json - نصب Package
- حذف Package
- استفاده از
require-dev - اجرای
composer install - اجرای
composer update - مفهوم
composer.lock - مفهوم
vendor - ساخت Autoload
- استفاده از PSR-4
- اجرای
composer dump-autoload - بررسی Dependencyها
- استفاده از Composer در Laravel
- استفاده از Composer در Deployment
Composer یکی از ابزارهای پایه برای توسعه مدرن PHP است و تسلط بر آن برای کار با Frameworkهایی مانند Laravel اهمیت زیادی دارد.
در مرحله بعدی، بهتر است به صورت عمیقتر سراغ Autoload در PHP برویم و بررسی کنیم PHP و Composer چگونه کلاسها را بدون require کردن دستی فایلها Load میکنند.
# سوالات متداول آموزش Composer
Composer چگونه نصب میشود؟
Composer ابتدا به PHP نیاز دارد. پس از نصب PHP میتوانید Composer را روی Windows، Linux و سایر سیستمهای پشتیبانیشده نصب کرده و با دستور composer -V نصب آن را بررسی کنید.
دستور نصب Package در Composer چیست؟
برای نصب Package از دستور زیر استفاده میشود:
composer require vendor/package
تفاوت composer install و composer update چیست؟
composer install Dependencyهای پروژه را نصب میکند و در صورت وجود composer.lock از نسخههای ثبتشده در آن استفاده میکند. composer update Dependencyها را بر اساس Constraintهای composer.json مجدداً بررسی و بهروزرسانی میکند.
composer.json چیست؟
فایل composer.json اطلاعات پروژه و Dependencyهای آن را نگهداری میکند.
composer.lock چیست؟
این فایل نسخههای دقیق Dependencyهای انتخابشده برای پروژه را ثبت میکند.
vendor در Composer چیست؟
vendor پوشهای است که Composer Dependencyهای نصبشده و فایلهای Autoload مربوط به آنها را در آن قرار میدهد.
آیا vendor را در Git قرار دهیم؟
در اغلب پروژههای PHP، vendor/ در Git قرار نمیگیرد و Dependencyها در محیط مقصد با composer install نصب میشوند.
چگونه یک Package را حذف کنیم؟
از دستور زیر استفاده کنید:
composer remove vendor/package
چگونه Composer را بهروزرسانی کنیم؟
بهروزرسانی خود Composer با بهروزرسانی Dependencyهای پروژه متفاوت است. برای Dependencyهای پروژه معمولاً از composer update استفاده میشود؛ اما برای خود Composer باید روش متناسب با نحوه نصب آن را استفاده کرد.
composer dump-autoload چه کاری انجام میدهد؟
این دستور Autoloader Composer را مجدداً تولید میکند و زمانی که تنظیمات Autoload پروژه تغییر کرده باشد کاربرد زیادی دارد.
# مقالات مرتبط
برای ساخت یک ساختار لینکسازی داخلی قوی در Cluster آموزش PHP، از این مقاله به صفحات مرتبط زیر لینک بده:
- Composer چیست؟
- Autoload در PHP
- Namespace در PHP
- OOP در PHP
- Dependency Injection در PHP
- SOLID در PHP
- Design Pattern در PHP
- PHP و MySQL
- REST API با PHP
- ساخت API با PHP
همچنین حتماً یک لینک طبیعی به Pillar اصلی «آموزش برنامه نویسی وب و PHP» قرار بده.





