PHP / Composer package manager

Composer package manager

PHP-д гуравдагч номын сангуудыг суулгаж удирдах хамгийн стандарт хэрэгсэл бол Composer юм. Node.js-ийн npm, Python-ий pip-тэй адилхан зарчмаар ажилладаг. Laravel, Symfony зэрэг фреймворкуудаас эхлээд жижиг туслах санг ч Composer-оор суулгадаг. Энэ хичээлд Composer суулгах, сан нэмэх, autoloading тохируулах аргыг бүрэн сурна — энэ мэдлэггүйгээр орчин үеийн PHP хөгжүүлэлт хийх боломжгүй.

Composer суулгах ба анхны тохиргоо

Composer нь composer.phar файл хэлбэртэй байдаг. Суулгасны дараа шинэ төсөл эхлүүлнэ:

bash
# Composer суулгах (Linux/Mac)
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# Windows дээр https://getcomposer.org/Composer-Setup.exe татна

# Суулгасан эсэх шалгах
composer --version

# Шинэ төсөл эхлүүлэх (интерактив)
composer init

# Эсвэл хурдан эхлүүлэх
composer init --name="myname/myapp" --type=project --no-interaction
json
{
    "name": "boldbat/myapp",
    "description": "Миний PHP апп",
    "type": "project",
    "require": {
        "php": ">=8.1"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    }
}

require нь production-д шаардлагатай санг, require-dev нь зөвхөн хөгжүүлэлтэд (тест, debugging) хэрэгтэй санг тодорхойлдог.

Сан суулгах ба ашиглах

packagist.org нь PHP-н сануудын хамгийн том бүртгэл юм. Хайж олоод суулгана:

bash
# Сан суулгах
composer require guzzlehttp/guzzle       # HTTP client
composer require vlucas/phpdotenv        # .env файл унших
composer require ramsey/uuid             # UUID үүсгэгч

# Зөвхөн development-д суулгах
composer require --dev phpunit/phpunit
composer require --dev symfony/var-dumper

# Тодорхой хувилбар суулгах
composer require monolog/monolog:^3.0

# Суулгасан сангуудыг шинэчлэх
composer update

# composer.lock-н дагуу яг тэр хувилбарт суулгах (production)
composer install
php
<?php
// vendor/autoload.php — Composer-н автоматаар үүсгэсэн файл
require_once 'vendor/autoload.php';

// Guzzle HTTP client ашиглах жишээ
use GuzzleHttp\Client;

$client = new Client(['timeout' => 10]);

try {
    $хариу = $client->get('https://api.example.mn/өгөгдөл');
    $өгөгдөл = json_decode($хариу->getBody()->getContents(), true);
    print_r($өгөгдөл);
} catch (Exception $e) {
    echo "Алдаа: " . $e->getMessage();
}
?>

PSR-4 autoloading — өөрийн классуудыг автоматаар ачаалах

Composer нь зөвхөн гуравдагч санг биш өөрийн классуудыг ч автоматаар ачааладаг:

bash
myapp/
├── composer.json
├── src/
│   ├── Controllers/
│   │   └── UserController.php    → namespace App\Controllers;
│   ├── Models/
│   │   └── User.php              → namespace App\Models;
│   └── Services/
│       └── MailService.php       → namespace App\Services;
├── tests/
│   └── UserTest.php              → namespace Tests;
└── vendor/                       → Composer-н файлууд (git-д оруулдаггүй)
php
<?php
// src/Models/User.php
namespace App\Models;

class User {
    public function __construct(
        public readonly int    $id,
        public string          $нэр,
        public string          $имэйл,
    ) {}

    public function json(): string {
        return json_encode([
            'id'    => $this->id,
            'нэр'   => $this->нэр,
            'имэйл' => $this->имэйл,
        ], JSON_UNESCAPED_UNICODE);
    }
}
?>
php
<?php
// public/index.php — вэбийн оролтын цэг
require_once dirname(__DIR__) . '/vendor/autoload.php';

use App\Models\User;
use App\Controllers\UserController;

// Autoloader src/Models/User.php-г автоматаар олно
$хэрэглэгч = new User(1, "Болд", "bold@example.mn");
echo $хэрэглэгч->json();
?>
bash
# Autoload файлуудыг дахин үүсгэх (src/-д шинэ класс нэмсэний дараа)
composer dump-autoload

# Optimized autoload (production-д)
composer dump-autoload --optimize

.env файл ашиглах

Нууц мэдээлэл (нууц үг, API key) кодод шууд бичихгүйгээр .env файлд хадгалдаг:

bash
# .env файл
DB_HOST=localhost
DB_NAME=myapp
DB_USER=root
DB_PASS=маш_нууц_нууц_үг

MAIL_HOST=smtp.example.mn
MAIL_PORT=587

APP_ENV=development
APP_DEBUG=true
php
<?php
// vlucas/phpdotenv ашиглан .env унших
require_once 'vendor/autoload.php';

use Dotenv\Dotenv;

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Шаардлагатай хувьсагчуудыг заавал байх шаардлагатай болгоно
$dotenv->required(['DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASS']);

// Одоо $_ENV болон getenv() -ээр уншиж болно
$холболт = sprintf(
    "mysql:host=%s;dbname=%s;charset=utf8mb4",
    $_ENV['DB_HOST'],
    $_ENV['DB_NAME']
);

$pdo = new PDO($холболт, $_ENV['DB_USER'], $_ENV['DB_PASS'], [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

echo "Холбогдлоо: " . $_ENV['DB_NAME'] . "\n";
?>

.env файлыг .gitignore-д нэмж, хэзээ ч git-д оруулахгүй. Хамтран ажиллагсдад .env.example файл өгдөг — жинхэнэ утгагүй, зөвхөн ямар хувьсагч шаардлагатайг харуулдаг загвар юм.

composer.lock — яг тэр хувилбарыг баталгаажуулах

bash
# composer.lock файл нь суулгасан бүх сангийн яг хувилбарыг хадгалдаг
# Git-д заавал оруулна — team-ийн бүх гишүүн яг ижил хувилбар авна

# Шинэ багаж дээр (production сервер, хамтран ажиллагч)
composer install    # composer.lock-ийн дагуу суулгана — update хийхгүй

# Хамгийн сүүлийн хувилбарт шинэчлэх
composer update     # composer.lock шинэчлэгдэнэ

# Зөвхөн нэг сангийн хувилбарыг шинэчлэх
composer update monolog/monolog

Дараагийн хичээлд:

Autoloading-ийн гүнзгий ойлголтыг судална. spl_autoload_register() ашиглан Composer-гүйгээр autoloading хэрхэн хэрэгжүүлдэг, PSR-4 стандарт яаж ажилладаг, namespace ба хавтасны бүтцийн хамаарлыг жишээгээр тайлбарлана.