koriym / dii
Yii 1 的依赖注入插件
0.5.0
2024-06-09 00:30 UTC
Requires
- php: ^7.1 || ^8.0
- ray/di: ^2.10
- yiisoft/yii: ^1.1.16
Requires (Dev)
- doctrine/coding-standard: ^8.2
- phpmd/phpmd: ^2.9
- phpunit/phpunit: ^8.5 || ^9.6.19
- squizlabs/php_codesniffer: ^3.5
- symfony/process: ^5.2
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