c11k / container
PSR-11 兼容容器
Requires
- php: >=7.1
- psr/container: ^1.0@dev
Requires (Dev)
- phpstan/phpstan: ^0.9.1
- phpunit/phpunit: ^6.5
- squizlabs/php_codesniffer: *
Provides
- psr/container-implementation: 1.0.0
This package is auto-updated.
Last update: 2024-01-29 03:07:33 UTC
README
这是一个 PSR-11 标准容器。容器已从 https://github.com/sitepoint-editors/Container 分支、修改、扩展和修改。
目录
安装
composer require c11k\container
如何使用
虽然这样做不是必须的,但将容器的配置分开是一种良好的实践。在这个例子中,我们将使用三个文件来创建 Monolog 组件的容器。
另一个良好的实践是使用类和接口路径作为服务名称。这提供了一个更严格的命名约定,使我们能够获得更多关于服务的信息。
在服务定义文件中,我们定义了三个服务。所有服务都需要构造函数注入参数。其中一些参数是从容器参数导入的,而另一些则是直接定义的。日志服务还需要对 pushHandler
方法进行两次调用,每次调用都导入不同的处理服务。
<?php // services.dist.php
// Value objects are used to reference parameters and services in the container
use C11K\Container\Reference\ParameterReference as PR;
use C11K\Container\Reference\ServiceReference as SR;
use Monolog\Logger;
use Monolog\Handler\NativeMailerHandler;
use Monolog\Handler\StreamHandler;
use Psr\Log\LoggerInterface;
return [
StreamHandler::class => [
'class' => StreamHandler::class,
'arguments' => [
new PR('logger.file'),
Logger::DEBUG,
],
],
NativeMailHandler::class => [
'class' => NativeMailerHandler::class,
'arguments' => [
new PR('logger.mail.to_address'),
new PR('logger.mail.subject'),
new PR('logger.mail.from_address'),
Logger::ERROR,
],
],
LoggerInterface::class => [
'class' => Logger::class,
'arguments' => [ 'channel-name' ],
'calls' => [
[
'method' => 'pushHandler',
'arguments' => [
new SR(StreamHandler::class),
]
],
[
'method' => 'pushHandler',
'arguments' => [
new SR(NativeMailHandler::class),
]
]
]
]
];
参数定义文件只返回一个值数组。这些被定义为一个多维数组,但它们通过引用使用以下记法访问:'logger.file'
或 'logger.mail.to_address'
。
<?php // parameters.dist.php
return [
'logger' => [
'file' => __DIR__.'/../app.log',
'mail' => [
'to_address' => '[email protected]',
'from_address' => '[email protected]',
'subject' => 'App Logs',
],
],
];
容器文件只提取服务和参数定义,并将它们传递给 Container
类的构造函数。
<?php // config/container.php
use C11K\Container\Container;
$services = include __DIR__.'/config/services.php';
$parameters = include __DIR__.'/config/parameters.php';
return new Container($services, $parameters);
现在我们可以在应用程序中获取容器并使用日志服务。
<?php // app/file.php
use Psr\Log\LoggerInterface;
require_once __DIR__.'/../vendor/autoload.php';
$container = include __DIR__.'/../config/container.php';
$logger = $container->get(LoggerInterface::class);
$logger->debug('This will be logged to the file');
$logger->error('This will be logged to the file and the email');
快速开始
只需从 ./config/services.php
返回一个服务数组,并从 ./config/parameters.php
返回一个参数数组。
<?php
use C11K\Container\Container;
require_once __DIR__ . '/../vendor/bin/autoload.php';
$contatiner = Container::createFromConfig();
$container->get()
将每次返回相同的对象。如果您需要一个新实例化的 $service,请调用 $container->factory()
。
作者
- Andrew Carter
- 由 Jeff Harris 分支
许可
MIT 许可证 (MIT)。请参阅 LICENSE 了解更多信息。
支持
请 提交问题 以获取支持。
贡献
请使用 Gitlab Flow 贡献。创建分支,添加提交,并 发起拉取请求。