c11k/container

此包已被弃用且不再维护。没有建议的替代包。

PSR-11 兼容容器

0.0.4 2017-12-11 00:19 UTC

This package is auto-updated.

Last update: 2024-01-29 03:07:33 UTC


README

build status coverage report 这是一个 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()

作者

许可

MIT 许可证 (MIT)。请参阅 LICENSE 了解更多信息。

支持

提交问题 以获取支持。

贡献

请使用 Gitlab Flow 贡献。创建分支,添加提交,并 发起拉取请求