marcel-strahl / container
基于PSR-11的简单、干净的PHP容器
v0.1.0
2023-02-03 22:07 UTC
Requires
- php: ^8.0
- psr/container: ^2.0
- webmozart/assert: ^1.11
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- php-parallel-lint/php-parallel-lint: ^1.3
- phpunit/phpunit: ^9.5
- psalm/plugin-phpunit: ^0.18.4
- roave/security-advisories: dev-latest
- vimeo/psalm: ^5.6
This package is auto-updated.
Last update: 2024-09-12 23:05:25 UTC
README
这是一个轻量级的依赖注入容器,与任何框架解耦。这个库可以用于生产,但我建议使用来自更大社区(如Symfony、Laravel或Laminas)的依赖注入容器会更好。
这个库是为了娱乐而开发的,但如果有人使用它,则会得到支持。
此项目也可以作为一个示例,以简化的方式展示现代DI容器的工作原理。
工作原理
composer require marcel-strahl/container
适用于PHP >= 8.0
此库使用PSR容器。
用法
<?php use MarcelStrahl\Container\FileLoader\AdapterBuilder; use MarcelStrahl\Container\FileLoader\PHPArrayAdapter; use MarcelStrahl\Container\ObjectBuilder\ObjectBuilderFactory; use MarcelStrahl\Container\Delegator\ObjectDelegator; use MarcelStrahl\Container\ClassContainer; use MarcelStrahl\Container\ObjectContainer; use MarcelStrahl\Container\AppContainer; use MarcelStrahl\Container\Dto\ObjectStore; use MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummy; $adapter = (new AdapterBuilder())->build(PHPArrayAdapter::class); $path = sprintf('%s/../Unit/FileLoader/php_array_config.php', __DIR__); Assert::stringNotEmpty($path); $builderFactory = new ObjectBuilderFactory(); $delegator = new ObjectDelegator($builderFactory); $classStore = $adapter->loadFileFromPath($path, ClassStore::create()); $classContainer = ClassContainer::create($classStore); $classContainer->compile(); $objectContainer = new ObjectContainer(ObjectStore::create(), $delegator); $app = AppContainer::initialize($classContainer, $objectContainer); $builderFactory->setContainer($app); // Insert `$app` into your application context
您需要遵循配置结构。需要注意的是,如果您不想指定别名或工厂,也可以指定一个空数组。
<?php declare(strict_types=1); return [ // class => [factory?: class-string, alias?: class-string, id?: non-empty-string] \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummy::class => [], \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummyWithFactory::class => [ 'factory' => \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummyWithFactory\Factory::class, ], \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummyWithServiceId::class => [ 'id' => 'serviceId', ], \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummyWithAlias::class => [ 'alias' => \MarcelStrahl\Tests\Unit\FileLoader\data\AliasInterface::class, ], \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummyWithFactory::class => [ 'alias' => \MarcelStrahl\Tests\Unit\FileLoader\data\AliasInterface::class, 'id' => 'serviceId', 'factory' => \MarcelStrahl\Tests\Unit\FileLoader\data\PhpArrayLoaderClassDummyWithFactory\Factory::class, ], ];