gandung/dependency-injection
Composer 安装命令:
composer require gandung/dependency-injection
包简介
A dependency injection container
README 文档
README
This is my simple dependency injection library in PHP
Features:
- Can resolve class dependency that placed only on constructor (autowiring)
- Binding concrete dependency into unresolved abstract, either closure or class name.
- Can do shared binding concrete dependency into unresolved abstract, either closure or class name.
- Can resolve concrete implementation on typehinted interface on constructor method.
- Can resolve concrete implementation which bound on interface directly.
- Registering service under an alias.
Setter injection and method injection not yet implemented. Feel free to look, or clone it for your own needs.
Autowiring:
Assume you have a class:
<?php namespace Unused; class Foo { /** * @var \SplPriorityQueue */ private $heap; public function __construct(\SplPriorityQueue $heap) { $this->heap = $heap; } }
And you have a class that depends on class Unused\Foo, however class Unused\Foo depends on class \SplPriorityQueue
<?php namespace Unused; class Bar { /** * @var Foo */ private $foo; public function __construct(Foo $foo) { $this->foo = $foo; } }
You can resolve an instance of class Bar without resolving Bar and \SplPriorityQueue manually
<?php use Unused\Bar; $container = new Container(); $bar = $container->make(Bar::class);
Binding concrete dependency into unresolved abstract (only class name)
<?php use Unused\Bar; use Unused\Foo; $container = new Container(); $container->bind(Bar::class, Foo::class); $bar = $container->make(Bar::class);
Now, $bar is an instance of Bar::class.
Binding concrete dependency into unresolved abstract (with closure)
<?php use Unused\Bar; use Unused\Foo; $container = new Container(); $container->bind(Bar::class, function($container) { return $container->make(Foo::class); }); $bar = $container->make(Bar::class);
Now, $bar is an instance of Bar::class too.
Shared binding concrete dependency into unresolved abstract (only class name)
<?php use Unused\Base; use Unused\BaseInterface; $container = new Container(); $container->singleton(BaseInterface::class, Base::class); $base = $container->make(BaseInterface::class);
Shared binding concrete dependency into unresolved abstract (with closure)
<?php use Unused\Base; use Unused\BaseInterface; $container = new Container(); $container->singleton(BaseInterface::class, function($container) { return $container->make(Base::class); }); $base = $container->make(BaseInterface::class);
Binding typehinted interface into unresolved abstract (class based and with closure)
Assume you have an BaseInterface interface:
<?php namespace Unused; interface BaseInterface { public function setFirstName($firstName); public function setMiddleName($middleName); public function setLastName($lastName); }
And a class which implements BaseInterface interface under the same namespace:
<?php namespace Unused; class Base implements BaseInterface { /** * @var string */ private $firstName; /** * @var string */ private $middleName; /** * @var string */ private $lastName; public function setFirstName($firstName) { $this->firstName = $firstName; } public function setMiddleName($middleName) { $this->middleName = $middleName; } public function setLastName($lastName) { $this->lastName = $lastName; } }
And a class which have typehinted interface in it's constructor
<?php namespace Unused; class Foo { /** * @var BaseInterface */ private $base; public function __construct(BaseInterface $base) { $this->base = $base; } }
You can resolve class Foo with binding class Base into BaseInterface first.
<?php use Unused\BaseInterface; use Unused\Base; use Unused\Foo; $container = new Container(); $container->bind(BaseInterface::class, Base::class); $foo = $container->make(Foo::class);
Or, you and bind concrete implementation of BaseInterface with closure
<?php use Unused\BaseInterface; use Unused\Base; use Unused\Foo; $container = new Container(); $container->bind(BaseInterface::class, function($container) { return $container->make(Base::class); }); $foo = $container->make(Foo::class);
Resolve concrete implementation which bound on interface directly
Assume you have an interface:
<?php namespace Unused; interface BaseInterface { public function setFirstName($firstName); public function setMiddleName($middleName); public function setLastName($lastName); }
And, concrete class which implements Unused\BaseInterface
<?php namespace Unused; class Base implements BaseInterface { /** * @var string */ private $firstName; /** * @var string */ private $middleName; /** * @var string */ private $lastName; /** * @implements */ public function setFirstName($firstName) { $this->firstName = $firstName; } /** * @implements */ public function setMiddleName($middleName) { $this->middleName = $middleName; } /** * @implements */ public function setLastName($lastName) { $this->lastName = $lastName; } }
Bind concrete implementation on that interface first (use either direct class name or closure)
<?php use Unused\Base; use Unused\BaseInterface; $container = new Container(); // with direct class name. $container->bind(BaseInterface::class, Base::class); // or, use a closure. $container->bind(BaseInterface::class, function($container) { return $container->make(Base::class); });
Then, get it directly.
$base = $container->make(BaseInterface::class);
Registering service under an alias (PSR-11 compatible.)
Assume you have a service which require a concrete implementation of a BaseInterface:
<?php namespace Unused; class FooService { /** * @var BaseInterface */ private $base; public function __construct(BaseInterface $base) { $this->base = $base; } }
Just bind a concrete implementation of BaseInterface, then register FooService under an alias (e.g: foo.service)
<?php $container = new Container(); $container->bind(BaseInterface::class, function($container) { return $container->make(Base::class); }); $container->register('foo.service', FooService::class); $service = $container->get('foo.service');
Unit Testing
If you want to run unit tests:
vendor/bin/phpunit
If you need more verbose:
vendor/bin/phpunit --verbose
gandung/dependency-injection 适用场景与选型建议
gandung/dependency-injection 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 140 次下载、GitHub Stars 达 1, 最近一次更新时间为 2017 年 05 月 28 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「container」 「dependency-injection」 「dependency-manager」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 gandung/dependency-injection 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 gandung/dependency-injection 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 gandung/dependency-injection 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A utility to install front-end files with Composer
Supporing Symfony's DependencyInjection component for your symfony1 project
A fast and intuitive dependency injection container.
Powerful class discovery system for Laravel with attribute-based scanning, directory traversal, and monorepo support
Dependency injection container for the Monolith framework.
The PSR-11 container bridges
统计信息
- 总下载量: 140
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 12
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-05-28