Composer package manager
PHP-д гуравдагч номын сангуудыг суулгаж удирдах хамгийн стандарт хэрэгсэл бол Composer юм. Node.js-ийн npm, Python-ий pip-тэй адилхан зарчмаар ажилладаг. Laravel, Symfony зэрэг фреймворкуудаас эхлээд жижиг туслах санг ч Composer-оор суулгадаг. Энэ хичээлд Composer суулгах, сан нэмэх, autoloading тохируулах аргыг бүрэн сурна — энэ мэдлэггүйгээр орчин үеийн PHP хөгжүүлэлт хийх боломжгүй.
Composer суулгах ба анхны тохиргоо
Composer нь composer.phar файл хэлбэртэй байдаг. Суулгасны дараа шинэ төсөл эхлүүлнэ:
# 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
{
"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-н сануудын хамгийн том бүртгэл юм. Хайж олоод суулгана:
# Сан суулгах
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
// 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 нь зөвхөн гуравдагч санг биш өөрийн классуудыг ч автоматаар ачааладаг:
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
// 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
// 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();
?>
# Autoload файлуудыг дахин үүсгэх (src/-д шинэ класс нэмсэний дараа)
composer dump-autoload
# Optimized autoload (production-д)
composer dump-autoload --optimize
.env файл ашиглах
Нууц мэдээлэл (нууц үг, API key) кодод шууд бичихгүйгээр .env файлд хадгалдаг:
# .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
// 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 — яг тэр хувилбарыг баталгаажуулах
# 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 ба хавтасны бүтцийн хамаарлыг жишээгээр тайлбарлана.