codesaur / container
Хөнгөн, хурдан, PSR-11 стандартад нийцсэн dependency injection container
Installs: 7
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/codesaur/container
Requires
- php: >=8.2.1
- psr/container: >=2.0.2
Requires (Dev)
- phpunit/phpunit: ^10.0
README
Хөнгөн, хурдан, PSR-11 стандартад нийцсэн dependency injection container.
Энэ багц нь codesaur framework-ийн үндсэн бүрэлдэхүүн боловч ямар ч PHP төслөөс бие даан ашиглах боломжтой.
Агуулга
- Танилцуулга
- Суурилуулалт
- Хэрэглээ
- API Reference
- Lazy Loading
- Advanced Usage
- Example хавтас
- Тест ажиллуулах
- CI/CD
- Код шалгалт
- Лиценз
- Зохиогч
Танилцуулга
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,developbranch-ууд руу 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