rumur/autowire

简单的 PHP 自动装配功能。

v1.0.0 2022-04-06 15:32 UTC

This package is auto-updated.

Last update: 2024-09-07 14:34:39 UTC


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 文件。