Composer — paketlar, composer.json, vendor/autoload.php
Muammodan boshlaylik
Saytingizga uchta yangi imkoniyat kerak: email yuborish, Excel fayl yasash va .env fayldan sozlamalarni o'qish. Har birini noldan yozish — haftalar. Internetda tayyor kutubxonalar bor. Endi nima qilasiz?
- ZIP ni yuklab, loyihaga ko'chirasizmi?
- Kutubxona boshqa 5 ta kutubxonaga bog'liq bo'lsa-chi — ularni ham qidirasizmi?
- Yangi versiya chiqsa — qo'lda almashtirasizmi?
- Hamkasbingiz loyihani ochganda unga ham hammasini qayta yuklab berasizmi?
Composer — PHP ning paket menejeri. JavaScript dagi npm, Python dagi pip ning PHP dagi ekvivalenti. Zamonaviy PHP loyihasini Composer siz tasavvur qilib bo'lmaydi.
O'rnatish
Windows: https://getcomposer.org dan Composer-Setup.exe ni yuklab o'rnating. Laragon da allaqachon bor.
macOS / Linux:
brew install composer # macOS
sudo apt install composer # Ubuntu
Tekshirish:
composer --version
Yangi loyiha
mkdir dokon && cd dokon
composer init
Composer bir nechta savol beradi (nom, tavsif, muallif). Natijada composer.json yaratiladi:
{
"name": "dilshod/dokon",
"type": "project",
"require": {
"php": ">=8.2"
},
"autoload": {
"psr-4": {
"Dokon\\": "src/"
}
}
}
composer.json — loyihaning "pasporti": qanday PHP versiyasi va qanday paketlar kerakligi.
Paket o'rnatish
Paketlar Packagist (https://packagist.org) da saqlanadi — 400 mingdan ortiq paket.
composer require vlucas/phpdotenv
Composer:
- Paketni va uning barcha bog'liqliklarini yuklab oladi
vendor/papkasiga joylashtiradicomposer.jsonga yozib qo'yadicomposer.lockni yaratadi yoki yangilaydi- Autoloader ni qayta yasaydi
"require": {
"php": ">=8.2",
"vlucas/phpdotenv": "^5.6"
}
Faqat ishlab chiqishda kerak bo'lgan paketlar (testlar, tahlil vositalari):
composer require --dev phpunit/phpunit phpstan/phpstan
Ular require-dev ga yoziladi va serverga o'rnatilmaydi.
Ishlatish
public/index.php:
<?php
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
// .env fayldan sozlamalarni o'qish
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
$dotenv->load();
$pdo = new PDO($_ENV['DB_DSN'], $_ENV['DB_USER'], $_ENV['DB_PASS']);
// O'z classlaringiz ham avtomatik yuklanadi
$savat = new Dokon\Savat();
.env (Git ga qo'shilmaydi):
DB_DSN="mysql:host=localhost;dbname=dokon;charset=utf8mb4"
DB_USER=dokon_app
DB_PASS=kuchli-parol
vendor/autoload.php — bitta require, va barcha paketlar hamda src/ dagi classlaringiz kerak bo'lganda o'zi yuklanadi (33-dars).
Versiya cheklovlari
"vlucas/phpdotenv": "^5.6"
| Yozuv | Ma'nosi | Ruxsat etilgan |
|---|---|---|
^5.6 |
Mos keladigan versiyalar | >=5.6.0 va <6.0.0 |
~5.6.2 |
Faqat patch yangilanishlar | >=5.6.2 va <5.7.0 |
5.6.* |
Faqat patch | 5.6.0, 5.6.1, ... |
5.6.2 |
Aniq versiya | Faqat 5.6.2 |
Ko'pchilik holatda ^ ishlatiladi. U Semantic Versioning ga tayanadi:
5 . 6 . 2
│ │ └── PATCH — xato tuzatildi, hech narsa buzilmaydi
│ └────── MINOR — yangi imkoniyat, eskisi buzilmaydi
└────────── MAJOR — orqaga mos bo'lmagan o'zgarish, kod buzilishi mumkin
^5.6 — "5.x ning istalgan versiyasi, lekin 6.0 ga avtomatik o'tma — u kodimni buzishi mumkin".
composer.lock — nima uchun muhim
composer.json — "menga 5.x kerak". composer.lock — "aynan 5.6.1 o'rnatildi, uning bog'liqligi aynan 1.3.2".
composer install # composer.lock dagi AYNAN versiyalarni o'rnatadi
composer update # composer.json ga ko'ra yangi versiyalarni topib, lock ni yangilaydi
| Buyruq | Qachon |
|---|---|
composer install |
Loyihani klonlaganda, serverga deploy qilganda |
composer update |
Paketlarni ataylab yangilamoqchi bo'lganda |
composer require x/y |
Yangi paket qo'shganda |
composer remove x/y |
Paketni olib tashlaganda |
Qoida: composer.lock ni Git ga qo'shing. Shunda sizda, hamkasbingizda va serverda bit-bitigacha bir xil versiyalar bo'ladi. "Menda ishlaydi-ku" muammosi yo'qoladi.
.gitignore
/vendor/
.env
vendor/ ni Git ga qo'shmang — u yuzlab megabayt bo'lishi mumkin va composer install bilan bir zumda tiklanadi.
Foydali paketlar
| Paket | Nima uchun |
|---|---|
vlucas/phpdotenv |
.env dan sozlamalar |
guzzlehttp/guzzle |
Boshqa API larga HTTP so'rovlar |
symfony/mailer |
Email yuborish |
monolog/monolog |
Professional loglash |
phpoffice/phpspreadsheet |
Excel fayllar |
ramsey/uuid |
UUID yaratish |
nesbot/carbon |
Sana bilan qulay ishlash |
phpunit/phpunit |
Testlar (--dev) |
phpstan/phpstan |
Kodni statik tahlil — xatolarni ishga tushirmasdan topadi (--dev) |
Composer skriptlari
composer.json:
"scripts": {
"serve": "php -S localhost:8000 -t public",
"test": "phpunit",
"analyse": "phpstan analyse src --level=6"
}
composer serve
composer test
Nima uchun shunday?
Nima uchun PHP da paket menejeri faqat 2012-yilda paydo bo'ldi, PHP esa 1995-yildan beri bor?
Undan oldin PEAR degan tizim bor edi, lekin u paketlarni butun serverga global o'rnatardi — ikki loyihaga bitta kutubxonaning ikki xil versiyasi kerak bo'lsa, muammo. Composer har bir loyihaga o'z vendor/ papkasini berdi va PSR-4 autoload standartini ommalashtirdi. Natijada PHP ekotizimi butunlay o'zgardi: Laravel, Symfony va minglab kutubxonalar bir-birini qayta ishlatadigan bo'ldi. Ko'pchilik "zamonaviy PHP" ning boshlanishini aynan Composer bilan bog'laydi.
Xulosa
Eslab qoling:
composer init— yangi loyiha,composer require x/y— paket qo'shishrequire __DIR__ . '/../vendor/autoload.php';— hammasini ulash^5.6— 5.x doirasida yangilanishlarga ruxsatcomposer install— lock bo'yicha;composer update— yangilashcomposer.lock→ Git ga;vendor/va.env→.gitignorega--dev— faqat ishlab chiqish uchun paketlar
Keyingi dars
40-dars: PSR standartlari — kod uslubi va autoload