koriym/dii

Yii 1 的依赖注入插件

0.5.0 2024-06-09 00:30 UTC

This package is auto-updated.

Last update: 2024-09-09 06:31:25 UTC


README

Yii 1 的依赖注入容器插件

此插件允许在对象实例及其依赖项使用之前对其进行配置,并将它们存储到容器类中以方便访问。

它使用干净且灵活的 Ray.Di DI 框架,这是一个类似 "Google Guice" 风格的 PHP 依赖注入框架。

Ray.Di 还允许您使用 AOP 编程,即装饰已配置的实例,以便在它们的任何方法之前或之后运行一些逻辑。

配置

引导文件

使用 composer 自动加载器而不是 Yii 自动加载器。

// composer autoloader
require dirname(__DIR__) . '/vendor/autoload.php';
spl_autoload_unregister([YiiBase::class, 'autoload']);

// set context module
Dii::setContext(\YourVendor\YourProject\Context\App::class);

// run the application
Yii::createWebApplication()->run();

绑定模块

模块是描述实例及其依赖项构建方式的类,它们提供了一种分组配置的自然方式。一个示例模块看起来像这样

<?php

namespace Koriym\Dii\Module;

use Ray\Di\AbstractModule;
use Vendor\Hello\BarInterceptor;
use Vendor\Hello\Foo;
use Vendor\Hello\FooInterface;

class AppModule extends AbstractModule
{
    protected function configure()
    {
        $this->bind(FooInterface::class)->to(Foo::class);
        $this->bindInterceptor(
            $this->matcher->any(),
            $this->matcher->startsWith('actionIndex'),
            [BarInterceptor::class]
        );
    }
}

上下文

您可以根据上下文进行必要的绑定。上下文类指定要绑定的模块。

use Koriym\Dii\Module\AppModule;
use Koriym\Dii\ModuleProvider;
use Ray\Di\AbstractModule;

class App implements ModuleProvider
{
    public function __invoke() : AbstractModule
    {
        return new AppModule();
    }
}

在这个示例中,我们用 TestModule 覆盖了 AppModule 的绑定。

class Test implements ModuleProvider
{
    public function __invoke() : AbstractModule
    {
        // override AppModule with TestModule
        return new TestModule(new AppModule());
    }
}

在控制器中注入依赖项

Ray.Di 能够根据注解将实例注入到您的控制器中

<?php

use Koriym\Dii\Injectable;
use Ray\Di\Di\Inject;
use Vendor\Hello\FooInterface;

class SiteController extends CController implements Injectable
{
    private $foo;

    /**
     * @Inject
     */
    public function setDeps(FooInterface $foo)
    {
        $this->foo = $foo;
    }

    public function actionIndex()
    {
        echo 'Hello World' . $this->foo->get();
    }
}

一旦创建控制器,所有带有 @Inject 注解的方法将获得提示类实例。这仅适用于设置方法,而不是构造函数。请实现标记接口 Injectable 来通知 Ray.Di 类可注入。

此外,任何由 Yii:createComponent() 方法创建的类也将生效。

演示

cd demo
composer install
composer serve