rumur / autowire
简单的 PHP 自动装配功能。
v1.0.0
2022-04-06 15:32 UTC
Requires
- php: >=7.1.0
Requires (Dev)
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.5
README
包安装
composer require rumur/autowire
如何使用它?
实际上非常简单。一个好的起点是创建一个 Autowire
类的实例。
// plugin-name.php <?php use Rumur\Autowiring\Autowire; $autowire = Autowire::create();
注册单例
Autowire
允许您注册任何实例/变量作为单例,因此当您的某个类或函数需要此类依赖时,您将始终得到相同的结果。
例如,假设您需要将 wpdb
类注入您的一些存储库中。为此,我们需要将 wbdb
注册为单例,并将您的一个存储库传递到 Autowire::make
方法中,其余的 Autowire
会为您处理。
// plugin-name.php <?php // ... $autowire->singleton(wpdb::class, fn() => $GLOBALS['wpdb']); // plugin/repositories/IOrderRepository.php interface IOrderRepository { public function find(int $order_id): ?Order public function findAll(): array } // plugin/repositories/OrderRepository.php use wpdb; class OrderRepository implements IOrderRepository { protected wpdb $connection; public function __construct(wpdb $connection) { $this->connection = $connection; } public function find(int $order_id): ?Order { // ... } public function findAll(): array { // ... } // ... } // Somewhere in the code $order = $autowire->make(OrderRepository::class)->find(2022);
绑定
如果您需要将特定接口与其实现绑定,Autowire
可以满足您的需求。
注意。在某些情况下,您不需要将所有可用的类绑定到 Autowire
以便能够将其作为依赖项解析,例如,下面的 OrderController
从未绑定到 Autowire
,但它仍然可以自动为您创建它。
// Somewhere where service providers are getting injected. $autowire->bind(IOrderRepository::class, OrderRepository::class) // app/http/api/OrderController.php class OrderController { protected IOrderRepository $repository; public function __construct(IOrderRepository $repository) { $this->repository; } public function index(): array { return $this->repository->findAll(); } } // Somewhere in you app. $ctrl = app()->autowire->make(OrderController::class); $orders = $ctrl->index();
Autowire 可调用
如果您需要为方法或任何其他可调用实例解析依赖项,Autowire::call
将会提供帮助。
<?php $autowire->singleton(IOrderRepository::class, OrderRepository::class) class OrderController { public function index(IOrderRepository $repository): array { return $repository->findAll(); } } $ctrl = new OrderController; $orders = app()->autowire->call([$ctrl,'index']); // Or if `index` method is static do the following. $orders = app()->autowire->call('OrderController::index');
许可证
此软件包采用 MIT 许可证许可 - 有关详细信息,请参阅 LICENSE.md 文件。