codesaur/container

Хөнгөн, хурдан, PSR-11 стандартад нийцсэн dependency injection container

Installs: 7

Dependents: 1

Suggesters: 0

Security: 0

Stars: 1

Watchers: 1

Forks: 0

Open Issues: 0

pkg:composer/codesaur/container

v3.0.0 2025-12-18 06:45 UTC

This package is auto-updated.

Last update: 2025-12-18 06:47:25 UTC


README

CI PHP Version License

Хөнгөн, хурдан, PSR-11 стандартад нийцсэн dependency injection container.
Энэ багц нь codesaur framework-ийн үндсэн бүрэлдэхүүн боловч ямар ч PHP төслөөс бие даан ашиглах боломжтой.

Агуулга

  1. Танилцуулга
  2. Суурилуулалт
  3. Хэрэглээ
  4. API Reference
  5. Lazy Loading
  6. Advanced Usage
  7. Example хавтас
  8. Тест ажиллуулах
  9. CI/CD
  10. Код шалгалт
  11. Лиценз
  12. Зохиогч

Танилцуулга

codesaur/container нь PHP 8.2+ орчинд ажиллах dependency injection container бөгөөд:

  • ✔ PSR-11 ContainerInterface-ийг хэрэгжүүлдэг
  • ✔ Lazy Loading - Сервисүүд зөвхөн шаардлагатай үед (get() дуудагдах үед) үүсгэгдэнэ
  • ✔ Reflection ашиглан классуудаас автоматаар instance үүсгэнэ
  • ✔ Closure / callable ашиглан services бүртгэх боломжтой
  • ✔ Standalone скрипт болон бүх төрлийн PHP төсөлд ашиглахад тохиромжтой
  • ✔ Framework-agnostic тул codesaur, Laravel, Symfony, Slim болон бусад бүх PHP framework-тэй бүрэн нийцтэй
  • ✔ Ямар ч гадны нэмэлт хамааралгүй

Суурилуулалт

Composer ашиглан суулгана:

composer require codesaur/container

Шаардлага:

  • PHP 8.2.1+
  • Composer
  • Гадны ямар ч dependency шаардлагагүй

Хэрэглээ

Контейнер үүсгэх

use codesaur\Container\Container;

$container = new Container();

Класс бүртгэх

$container->set(MyClass::class);

Lazy Loading: set() дуудахад instance үүсгэгдэхгүй, зөвхөн тодорхойлолт хадгалагдана. Instance нь анх удаа get() дуудагдах үед үүсгэгдэнэ.

Класс параметртэйгээр бүртгэх

$container->set(MyService::class, ['hello', 123]);

Reflection автоматаар:

new MyService('hello', 123);

гэсэн instance үүсгэнэ.

Service авах

$service = $container->get(MyService::class);

Lazy Loading: Эхний удаа get() дуудахад instance үүсгэгдэнэ. Дараагийн дуудлагуудад кэшлэгдсэн instance буцаана (singleton pattern).

Service байгаа эсэхийг шалгах

$container->has(MyService::class); // true / false

Service устгах

$container->remove(MyService::class);

API Reference

Товч танилцуулга

set(string $name, mixed $definition = []): void

  • Класс бүртгэх
  • Lazy Loading: Instance одоо үүсгэгдэхгүй, зөвхөн тодорхойлолт хадгалагдана
  • Reflection ашиглан instance үүсгэнэ (get() дуудагдах үед)
  • Давхар бүртгэхийг хориглоно

get(string $name): mixed

  • Бүртгэлтэй instance буцаана
  • Lazy Loading: Эхний удаа дуудахад instance үүсгэнэ, дараа нь кэшлэгдсэн instance буцаана
  • Байхгүй бол NotFoundException шиднэ

has(string $name): bool

  • Бүртгэлтэй эсэхийг шалгана

remove(string $name): void

  • Сервисийг контейнерээс устгана

Exceptions

NotFoundException

  • Бүртгэлгүй service авахыг оролдох үед

ContainerException

  • Давхар бүртгэх
  • Reflection-иас алдаа гарах
  • Бусад дотоод алдаанууд

Дэлгэрэнгүй мэдээллийг API.md файлаас үзнэ үү. (PHPDoc-уудаас Cursor AI ашиглан автоматаар үүсгэсэн)

Lazy Loading

Энэ контейнер нь lazy loading механизмыг дэмждэг. Энэ нь:

Давуу талууд

  • Гүйцэтгэл: Хүнд сервисүүд зөвхөн шаардлагатай үед үүсгэгдэнэ
  • 💾 Санах ой: Ашиглаагүй сервисүүд санах ой эзлэхгүй
  • 🎯 Оновчтой ашиглалт: Зөвхөн ашиглаж буй сервисүүд л үүсгэгдэнэ

Хэрхэн ажилладаг

// set() дуудахад instance үүсгэгдэхгүй
$container->set(HeavyService::class);

// get() дуудахад л instance үүсгэгдэнэ
$service = $container->get(HeavyService::class);

// Дараагийн дуудлагуудад кэшлэгдсэн instance буцаана
$service2 = $container->get(HeavyService::class); // $service === $service2

Callable-тай ашиглах

// Callable ч мөн lazy loading-тэй ажиллана
$container->set('config', function() {
    // Энэ код зөвхөн get() дуудагдах үед ажиллана
    return [
        'db_host' => 'localhost',
        'db_name' => 'mydb',
    ];
});

// Callable одоо дуудагдахгүй
// ...

// get() дуудахад л callable ажиллана
$config = $container->get('config');

Advanced Usage

Бусад сервисээс хамаарал авах

class A {}
class B {
    public function __construct(A $a) {}
}

$container->set(A::class);
$container->set(B::class);

$b = $container->get(B::class);

Closure / callable ашиглан service бүртгэх

Container нь callable / closure-ийг дэмждэг.
Энэ тохиолдолд сервисийг factory function хэлбэрээр бүртгэнэ.

$container->set('config', fn() => [
    'db_host' => 'localhost',
    'debug'   => true,
]);

Container дотор ашиглах жишээ:

$container->set(Logger::class, function ($c) {
    $cfg = $c->get('config');
    return new Logger($cfg['db_host'], $cfg['debug']);
});

Service дуудах:

$logger = $container->get(Logger::class);

Энэ хэлбэр нь:

  • Хөнгөн factory pattern
  • Дотоод хамааралтай сервисүүдийг container-аас авах боломжтой
  • Runtime үед динамик утга хийхэд тохиромжтой

Runtime үед service солих

$container->remove(Database::class);
$container->set(Database::class, ['127.0.0.1']);

Dynamic arguments

$container->set(Printer::class, ['Hello world!']);

Simple aliasing

$container->set(Logger::class);
$container->set('log', [ $container->get(Logger::class) ]);

Example хавтас

example/index.php файлд контейнерийн бодит жишээ бий:

Локал серверээр ажиллуулах:

php -S localhost:9080 -t example

Тест ажиллуулах

Энэ төсөлд PHPUnit ашиглан unit test болон integration test-үүд бий. Тестүүдийг ажиллуулахын тулд:

1. Composer dependencies суулгах

Windows (PowerShell эсвэл Command Prompt)

composer install

Linux / macOS (Terminal)

composer install

Энэ нь PHPUnit болон бусад dev dependencies-ийг суулгана.

2. Тест ажиллуулах

Windows (PowerShell)

# Бүх тестүүдийг ажиллуулах
.\vendor\bin\phpunit

# Тодорхой тест файл ажиллуулах
.\vendor\bin\phpunit tests\ContainerTest.php

# Integration test ажиллуулах
.\vendor\bin\phpunit tests\IntegrationTest.php

Windows (Command Prompt)

# Бүх тестүүдийг ажиллуулах
vendor\bin\phpunit

# Тодорхой тест файл ажиллуулах
vendor\bin\phpunit tests\ContainerTest.php

# Integration test ажиллуулах
vendor\bin\phpunit tests\IntegrationTest.php

Linux / macOS (Terminal)

# Бүх тестүүдийг ажиллуулах
vendor/bin/phpunit

# Тодорхой тест файл ажиллуулах
vendor/bin/phpunit tests/ContainerTest.php

# Integration test ажиллуулах
vendor/bin/phpunit tests/IntegrationTest.php

3. Тест coverage харах

Windows (PowerShell)

.\vendor\bin\phpunit --coverage-text

Windows (Command Prompt)

vendor\bin\phpunit --coverage-text

Linux / macOS (Terminal)

vendor/bin/phpunit --coverage-text

4. Тодорхой тест method ажиллуулах

Windows (PowerShell)

# Тодорхой тест класс дахь method ажиллуулах
.\vendor\bin\phpunit --filter testSetAndGet tests\ContainerTest.php

Windows (Command Prompt)

vendor\bin\phpunit --filter testSetAndGet tests\ContainerTest.php

Linux / macOS (Terminal)

vendor/bin/phpunit --filter testSetAndGet tests/ContainerTest.php

Тестүүдийн бүтэц

  • tests/ContainerTest.php - Container классын unit test-үүд
  • tests/ContainerExceptionTest.php - ContainerException классын test-үүд
  • tests/NotFoundExceptionTest.php - NotFoundException классын test-үүд
  • tests/IntegrationTest.php - Integration test-үүд (бодит хэрэглээний сценариуд)

Тестүүд нь дараах зүйлсийг шалгана:

  • ✅ Service бүртгэх, авах үйлдлүүд
  • ✅ Constructor аргументууд дамжуулах
  • ✅ Exception handling
  • ✅ Callable/closure дэмжлэг
  • ✅ Lazy loading (сервис зөвхөн get() дуудагдах үед үүсгэгдэх)
  • ✅ Instance кэшлэлт (singleton behavior)
  • ✅ PSR-11 стандартын нийцтэй байдал
  • ✅ Edge case-үүд (optional parameters, no constructor, гэх мэт)
  • ✅ Integration test-үүд (бодит application сценариуд, dependency chain, service replacement, гэх мэт)

CI/CD

Энэ төсөлд GitHub Actions ашиглан CI/CD pipeline тохируулсан байна.

CI Pipeline

GitHub Actions workflow нь дараах зүйлсийг гүйцэтгэнэ:

  • Multi-version PHP тест: PHP 8.2, 8.3, 8.4 дээр тест ажиллуулна
  • Multi-platform тест: Ubuntu болон Windows дээр тест ажиллуулна
  • Code coverage: Codecov руу coverage тайлан илгээнэ
  • Syntax check: PHP файлуудын синтакс шалгалт

CI Status

CI pipeline нь дараах үйлдлүүдэд автоматаар ажиллана:

  • main, master, develop branch-ууд руу push хийхэд
  • Pull request үүсгэхэд

CI статусыг GitHub repository-ийн Actions tab-аас харж болно.

Локал дээр CI-тэй ижил тест ажиллуулах

CI дээр ажиллаж буй тестүүдийг локал дээр ажиллуулах:

Windows (PowerShell)

# Бүх тестүүдийг ажиллуулах
.\vendor\bin\phpunit

# Coverage-тэй ажиллуулах
.\vendor\bin\phpunit --coverage-text

# Тодорхой тест файл ажиллуулах
.\vendor\bin\phpunit tests\IntegrationTest.php

Windows (Command Prompt)

vendor\bin\phpunit
vendor\bin\phpunit --coverage-text
vendor\bin\phpunit tests\IntegrationTest.php

Linux / macOS (Terminal)

# Бүх тестүүдийг ажиллуулах
vendor/bin/phpunit

# Coverage-тэй ажиллуулах
vendor/bin/phpunit --coverage-text

# Тодорхой тест файл ажиллуулах
vendor/bin/phpunit tests/IntegrationTest.php

Код шалгалт

Төслийн кодын нарийвчилсан шалгалтын тайланг CODE_REVIEW.md файлаас харна уу. (Cursor AI ашиглан үүсгэсэн)

Лиценз

Энэ төсөл MIT лицензтэй.

Зохиогч

Narankhuu
📧 codesaur@gmail.com
📲 +976 99000287
🌐 https://github.com/codesaur