borschphp / container
一个简单的PSR-11容器实现。
1.1.2
2024-05-14 19:22 UTC
Requires
- php: ^8.0
- psr/container: ^2
Requires (Dev)
- nikic/php-parser: ^4
- pestphp/pest: ^1.22
README
为您的Web项目提供一个轻量级且易于使用的PSR-11容器。
安装
通过 composer
composer require borschphp/container
用法
use Borsch\Container\Container; $container = new Container(); // Add your dependencies $container->set('db', fn() => new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password')); // Retrieve your dependencies $db = $container->get('db');
参数化依赖
在这个例子中,我们在一个名为 db
的条目中定义一个PDO服务。
然后,我们按照构造函数的顺序设置参数的值
PDO::__construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
) :
最后,我们检索PDO服务。
use Borsch\Container\Container; $container = new Container(); $container ->set('db', PDO::class) ->addParameter('mysql:host=localhost;dbname=mydb') ->addParameter('user') ->addParameter('password'); $db = $container->get('db');
共享和非共享依赖
在这个例子中,我们定义了一个默认情况下共享的logger服务。
我们检索了logger服务两次,因此我们可以看到这两个实例是相同的。
use Borsch\Container\Container; $container = new Container(); $container ->set('logger', fn() => new Logger()) ->cache(true); $logger1 = $container->get('logger'); $logger2 = $container->get('logger'); // $logger1 and $logger2 are the same instances
默认情况下自动装配
在这个例子中,我们创建了一个需要实例化一个Logger
实例的自定义类
class MyApp { public function __construct( protected Logger $logger ) {} }
我们在容器中创建了一个名为Logger::class
的条目,并使用闭包来实例化它。
我们在容器中创建了一个名为MyApp::class
的条目;由于我们没有提供第二个参数,容器将尽力从环境中获取所需的参数(在这里,是一个Logger
)。
use Borsch\Container\Container; $container = new Container(); $container->set(Logger::class, function () { $logger = new Logger('app'); $logger->pushHandler(new StreamHandler('path/to/log/file.log')); return $logger; })-> cache(true); $container->set(MyApp::class); $app = $container->get(MyApp::class); // $app is instantiated with the logger from entry Logger::class
在定义中使用容器获取依赖
假设我们在容器中定义了一个PDO::class
,并想使用PdoAdapter在Symfony CacheInterface
中使用它。
我们可以简单地通过在函数参数中请求它来获取我们定义的PDO::class
实例。
use Borsch\Container\Container; $container = new Container(); $container->set(PDO::class, function () { $pdo = new PDO('sqlite:/path/to/my/database.sqlite'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); return $pdo; })->cache(true); $container->set( CacheInterface::class, // PDO instance defined upper will be injected here as parameter fn(PDO $pdo) => new PdoAdapter($pdo) )->cache(true);
许可证
该软件包采用MIT许可证。有关更多信息,请参阅许可证文件。