delights / box
Box,PHP的智能自动连接容器。
Requires
- php: ^7.4
- psr/container: ^1.0
Requires (Dev)
- felixdorn/release-that: ^0.4.0
- phpstan/phpstan: ^0.12.19
- phpunit/phpunit: ^9.1
- squizlabs/php_codesniffer: ^3.5
README
Box,PHP的智能自动连接容器。
入门指南
安装
您可以使用Composer安装此库,如果您还没有安装,请下载它。
您可以选择运行以下命令
composer require delights/box
或者通过在您的composer.json
中添加一个需求
{ "require": { "delights/box": "0.3.0" } }
添加需求后,别忘了运行composer install
。
在深入自动连接和其他功能之前,我们需要创建一个容器实例。
use Delights\Box\Container; $container = new Container();
绑定
您可以将一些内容绑定到容器中,它的工作方式就像一个键 => 值数组。
$container->bind('key', 'value'); echo $container->resolve('key'); // prints "value"
如果您需要更具体的参数,您可以在闭包中绑定一个类,
$container->bind(Crawler::class, function () { return new Crawler('f4dg65gd6fg465g'); });
每次您请求Crawler::class
时,这个闭包都会被执行,并创建一个新的Crawler
实例。为了避免这种情况,您可以使用singleton
方法。
$container->singleton(Connection::class, function () { return new Connection(); });
现在,Connection
类将只实例化一次,闭包将不会再次执行。
您可能想为您的Crawler
使用一个接口,这样您就可以轻松地交换实例和其他内容。然而,当需要CrawlerInterface
时,您想要检索Crawler
实例。而不是手动绑定这些类,您可以使用bindToImplementation
方法。
$container->bindToImplementation(CrawlerInterface::class, Crawler::class); // same as $container->bindToImplementation(CrawlerInterface::class, new Crawler); // same as $container->bindToImplementation(CrawlerInterface::class, function () { return new Crawler; });
解析
智能解析参数是此包的主要目标。您可以解析需要参数的任何内容,包括构造函数、闭包、方法、函数。我们甚至支持解析有注解的属性。
自动连接
自动连接允许容器使用反射API自动解析依赖关系。
use Delights\Box\Container; $container = new Container(); class SomeClass {} $container->resolve(SomeClass::class); // returns an instance of "SomeClass" class SomeOtherClass { public function __construct(SomeClass $dep) { $this->dep = $dep; } } $container->resolve(SomeOtherClass::class); // returns an instance of "SomeOtherClass" // with $this->dep set to an instance of "SomeClass"
容器可以解析非类型化的参数,但只有两种情况:它们应该允许为null或具有默认值。
解析对象方法
class PostsRepository { public function all() { return ['My article']; } } class PostController { public function index(PostsRepository $repository) { return $repository->all(); } } $container->call(PostController::class, 'index'); // This returns |'My article']
解析闭包
$container->closure(function (SomeClass $class) { return $class instanceof SomeClass; }); // returns true
使用任意参数解析
class Vec2 { protected int $x; protected int $y; public function __construct(int $x, int $y) { $this->x = $x; $this->y = $y; } } $container->resolve(Vec2::class, [ 'x' => 2, 'y' => 4 ]); // returns an instance of "Vec2"
顺序无关紧要,在我们的例子中,它可以是[x, y]
或[y, x]
。
您可以将任意参数传递给任何解析函数。
单例
您可能想要有一个全局容器,它可以在您的应用程序中保持相同的绑定。
通常,您想要避免这种行为。
use Delights\Box\PersistentContainer; PersistentContainer::getInstance();
在这里,当您第一次调用它时,将创建一个新实例。然而,如果您已经创建了一个实例,将返回相同的实例。
静态代理
有一个小捷径。
use Delights\Box\PersistentContainer; // instead of this PersistentContainer::getInstance()->bind('some', 'thing'); // you can do that PersistentContainer::bind('some', 'thing');
这适用于任何PersistentContainer
的公共方法。
安全
如果您发现任何与安全相关的问题,请通过oss@dorns.fr发送电子邮件,而不是使用问题跟踪器。
致谢
许可
版权所有 2020 Félix Dorn
特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许获得软件的人进行此类操作,但受以下条件的限制:上述版权声明和本许可声明应包含在软件的所有副本或主要部分中
本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于对适销性、特定用途的适用性和非侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论该责任源于合同行为、侵权行为或其他,以及与软件的使用或其他相关事宜。