Composer — paketlar, composer.json, vendor/autoload.php

~15 daq · PHP · Zamonaviy 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:

  1. Paketni va uning barcha bog'liqliklarini yuklab oladi
  2. vendor/ papkasiga joylashtiradi
  3. composer.json ga yozib qo'yadi
  4. composer.lock ni yaratadi yoki yangilaydi
  5. 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'shish
  • require __DIR__ . '/../vendor/autoload.php'; — hammasini ulash
  • ^5.6 — 5.x doirasida yangilanishlarga ruxsat
  • composer install — lock bo'yicha; composer update — yangilash
  • composer.lock → Git ga; vendor/ va .env → .gitignore ga
  • --dev — faqat ishlab chiqish uchun paketlar

Keyingi dars

40-dars: PSR standartlari — kod uslubi va autoload