定制 acclimate/container 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

acclimate/container

最新稳定版本:2.0.0

Composer 安装命令:

composer require acclimate/container

包简介

Provides adapters for various third-party service containers.

README 文档

README

License Latest Stable Version Build Status Code Coverage Scrutinizer Code Quality

Get Acclimated! Use any third-party dependency injection containers and service locators in your code by adapting them to a common container interface. Acclimate was created by Jeremy Lindblom.

Introduction

It seems like every framework has its own container object. They come in many shapes and sizes (service locator, service manager, service container, dependency injection (DI) container, registry, etc.), but are all generally used in a similar way.

The wide variety of implementations makes it hard for other frameworks, framework-agnostic libraries, or some applications to get the full benefits of using an inversion of control (IoC) system, because they either need to:

  1. Write their own container implementation (NIH Syndrome)
  2. Have a long-term dependency on a particular, third-party container implementation (and force that dependency on their users, which may already be using a different container implementation)
  3. Implement an abstraction layer to support one or more third-party containers

Acclimate is a library that does #3 for you. It provides a set of adapters for the most popular container implementations. This allows you to adapt, or "acclimate", instances of these containers to a common, normalized, and interoperable interface. Using Acclimate allows your framework, library, or application to retrieve items from the container objects of third-party libraries. That's interoperability!

The Container Interface

The ContainerInterface used by Acclimate comes from the psr/container project. It attempts to normalize the various implementations of container interfaces (whether they be for service locators, dependency injection containers, or something else similar) to a simple, readonly interface, that allows users to retrieve entries from any third-party container in a consistent way.

Acclimate v1 and previous use the similar container-interop/container-interop standard

The ContainerInterface looks like this:

namespace Psr\Container; interface ContainerInterface { /**  * @param string $id  * @return mixed  * @throws NotFoundException  * @throws ContainerException  */ public function get($id); /**  * @param string $id  * @return bool  */ public function has($id); }

Installation

Install the acclimate/container package using Composer. This will also also install psr/container, which provides the ContainerInterface.

Warning: If you install Acclimate with dev dependencies, you will get A LOT of packages from various frameworks (e.g., ZF, Symfony, Laravel, etc.). These packages are required for testing only to ensure that all of the adapter classes work correctly. They are not included when you run Composer with --no-dev.

Note: We recommend using Composer and Composer's autoloader to load this library. If you are not using Composer's autoloader, be sure to use a PSR-4 compliant autoloader and map the namespace prefix Acclimate\Container\ to the src/ directory in order to correct autoload the classes.

Basic Usage

Acclimate: Container provides a ContainerAcclimator object that is used to adapt a container object to a normalized ContainerInterface. In terms of design patterns, it's essentially a factory for adapters.

Here is an example of how to use the ContainerAcclimator:

<?php // Require the Composer autoloader require 'vendor/autoload.php'; use Acclimate\Container\ContainerAcclimator; // Create a `Pimple` container and store an `SplQueue` object in it $pimple = new Pimple(); $pimple['queue'] = function() { $queue = new SplQueue(); $queue->enqueue('Hello!'); return $queue; }; // Create a `ContainerAcclimator` and use it to adapt the `Pimple` container to the Acclimate `ContainerInterface` $acclimator = new ContainerAcclimator; $container = $acclimator->acclimate($pimple); // Use the adapted container via the common interface to fetch the queue object $queue = $container->get('queue'); echo $queue->dequeue(); // Look! The queue object still works! #> Hello!

Now you can use the container from your favorite framework and acclimate it into your other code. :-)

Container Decorators

The default behavior of a container implementing the ContainerInterface is to throw a Psr\Container\NotFoundExceptionInterface when using get() to retrieve an entry that does not actually exist in the container. In some cases, you may want to change this default behavior to do something else instead (e.g., return null). Container decorators allow you to easily modify the behavior of a container. acclimate\container ships with 3 decorators (NullOnMissContainer, CallbackOnMissContainer, and FailoverOnMissContainer), but allows you to easily create your own by extending Acclimate\Container\Decorator\AbstractContainerDecorator.

Here is an example of how to use the NullOnMissContainer decorator:

<?php // Require the Composer autoloader require 'vendor/autoload.php'; use Acclimate\Container\ArrayContainer; use Acclimate\Container\Decorator\NullOnMissContainer; use Psr\Container\NotFoundExceptionInterface; // Create an empty, basic container following the `ContainerInterface` $container = new ArrayContainer(); // Normally, this container will throw an exception on missing items try { $item = $container->get('foo'); } catch (NotFoundExceptionInterface $e) { echo $e->getMessage() . "\n"; } # There is no entry found in the container for the identifier "foo". // Decorate the container so that null is returned instead of throwing an exception $container = new NullOnMissContainer($container); $item = $container->get('foo'); var_dump($item); #> NULL

Composite Container

You can create composite containers if your use case requires that you need to fetch data from two or more different container objects. For the sake of the following example, we will say the you have a Symfony Container stored in the variable $sfContainer, and a Zend ServiceManager stored in the variable $zfContainer.

use Acclimate\Container\ContainerAcclimator; use Acclimate\Container\CompositeContainer; // First, let's acclimate these containers $acclimator = new ContainerAcclimator; $sfContainer = $acclimator->acclimate($sfContainer); $zfContainer = $acclimator->acclimate($zfContainer); // Now, we will put these two containers together $container = new CompositeContainer([$sfContainer, $zfContainer]); // When we execute the `has()` method of the container, it will return `true` // if at least one of these containers contains an item identified by "foo" $exists = $container->has('foo');

This is essentially a way to support container chaining, but uses the Composite design pattern instead of the Chain of Command design pattern. You can also use the FailoverOnMissContainer decorator to support chaining.

Supported Containers

Also, the Silex Application and other projects descending from Pimple can be used with Acclimate as well.

Deprecated Containers

Support for the following containers is deprecated in version 1.1, and will be removed in 2.0:

What if the Container I use is not supported?

Please consider submitting a Pull Request with an adapter for your container and a corresponding test.

Before you get to that point though, you can create the adapter yourself (which is really easy to do actually, just look at the included ones), and use the ContainerAcclimator::registerAdapter() method to wire up your adapter to Acclimate. You will need to provide the fully qualified class name (FQCN) of both the adapter class and the base class or interface of the container you want to be able to adapt (the "adaptee").

Assuming that you have a $container object that implements Your\Favorite\ContainerInterface, and you have written an adapter class named Your\Favorite\ContainerAdapter, here is an example of how you can make these work in Acclimate:

use Acclimate\Container\ContainerAcclimator; // Instantiate the `ContainerAcclimator` and register your custom adapter $acclimator = new ContainerAcclimator; $acclimator->registerAdapter('Your\Favorite\ContainerAdapter', 'Your\Favorite\ContainerInterface'); // Use Acclimate to adapt your container $adaptedContainer = $acclimator->acclimate($container);

Resources

acclimate/container 适用场景与选型建议

acclimate/container 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 385.16k 次下载、GitHub Stars 达 219, 最近一次更新时间为 2026 年 01 月 04 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「dependency injection」 「container」 「adapter」 「service locator」 「decorator」 「interoperability」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 acclimate/container 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 acclimate/container 我们能提供哪些服务?
定制开发 / 二次开发

基于 acclimate/container 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 385.16k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 221
  • 点击次数: 33
  • 依赖项目数: 25
  • 推荐数: 0

GitHub 信息

  • Stars: 219
  • Watchers: 12
  • Forks: 17
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-01-04