pchouse/php-di

1.0.0 2023-12-20 17:09 UTC

This package is auto-updated.

Last update: 2024-09-15 10:37:55 UTC


README

依赖注入库

安装

composer require pchouse/php-di

用法

创建一个返回数组的绑定文件
Binds.php

    return [

        new Bind(
            Scope::TRANSIENT,
            IDependency::class,
            Dependency::class
        ),
    
        new Bind(
            Scope::TRANSIENT,
            IDependencyWiredOne::class,
            DependencyWiredOne::class
        ),
    
        new Bind(
            Scope::TRANSIENT,
            IDependencyWiredTwo::class,
            DependencyWiredTwo::class
        ),
    
        new Bind(
            Scope::SINGLETON,
            IDependencyWiredSingleton::class,
            DependencyWiredSingleton::class
        ),
    
        new Bind(
            Scope::PROVIDES,
            DependencyProvides::class,
            function () {
                $provides = new DependencyProvides();
                $provides->setRandom(
                    (new Randomizer())->getInt(9, 99999)
                );
                return $provides;
            }
        ),
    
        new Bind(
            Scope::SINGLETON,
            DependencyProvidesSingleton::class,
            function () {
                $provides = new DependencyProvidesSingleton();
                $provides->setRandom(
                    (new Randomizer())->getInt(9, 99999)
                );
                return $provides;
            }
        ),
    ];

创建一个返回数组的路由文件
Routes.php

    return [
        new Bind(Scope::ROUTE, IDependencyController::class, DependencyController::class),
    ];

在 bootstrap.php 或其他位置配置容器

    
    Container::$bindsFilePath  = "/path/to/Binds.php";
    Container::$routesFilePath = "/path/to/Routes.php";

使用注入的类的示例
如果有参数,将构造函数标记为 #[Inject]
如果你想要使用事件,将需要注入的属性标记为 #[Inject]。实现 IDIEvents 接口以使用事件

    
    class Dependency implements IDIEvents, IDependency
    {
    
        private bool $afterInstanceCreatedInit = false;
    
        private bool $beforeReturnInstanceInit = false;
    
        #[Inject]
        private IDependencyWiredOne $dependencyWiredOne;
    
        private int $rand = 0;
    
        #[Inject]
        public function __construct(private IDependencyWiredTwo $dependencyWiredTwo)
        {
        }
        
        public function getDependencyWiredOne(): IDependencyWiredOne
        {
            return $this->dependencyWiredOne;
        }
        
        public function setDependencyWiredOne(IDependencyWiredOne $dependencyWiredOne): void
        {
            $this->dependencyWiredOne = $dependencyWiredOne;
        }
        
        public function getDependencyWiredTwo(): IDependencyWiredTwo
        {
            return $this->dependencyWiredTwo;
        }
        
        public function setDependencyWiredTwo(IDependencyWiredTwo $dependencyWiredTwo): void
        {
            $this->dependencyWiredTwo = $dependencyWiredTwo;
        }
    
        public function afterInstanceCreated(): void
        {
            $this->afterInstanceCreatedInit = true;
        }
    
        /**
         * @throws \Exception
         */
        public function beforeReturnInstance(): void
        {
            if (!$this->afterInstanceCreatedInit) {
                throw new \Exception(
                    "The AfterInstanceCreated did not run"
                );
            }
            $this->beforeReturnInstanceInit = true;
        }
        
        public function isAfterInstanceCreatedInit(): bool
        {
            return $this->afterInstanceCreatedInit;
        }
        
        public function isBeforeReturnInstanceInit(): bool
        {
            return $this->beforeReturnInstanceInit;
        }
        
        public function getRand(): int
        {
            return $this->rand;
        }
        
        public function setRand(int $rand):void
        {
            $this->rand = $rand;
        }
    }

在代码的任何部分手动获取实例

    
    $instance = \PChouse\Di\Container::get(ICalssName);
    // OR
    $route = \PChouse\Di\Container::getRoute(IClassName);  

在测试模式下使用模拟构建
在测试 bootstrap.php 中设置一个常量:const PHP_DI_TEST = 1;
只有标记为模拟的实例将在容器中替换

    
       
     Container::build(
            [
                new Bind(Scope::MOCK, IDependencyWiredSingleton::class, $mock)
            ]
     );

     $dependency = Container::get(IDependency::class);

作用域

    
    Scope::TRANSIENT // Allways a new instance
    Scope::SINGLETON // Create a singleton instance
    Scope::PROVIDES  // For manually created instaces

许可证

版权所有 © 2023 Reflexão, Sistemas e Estudos Informáticos, Lda

在此特此授予任何获取本软件及其相关文档副本(以下简称“软件”)的人士,在不受限制的情况下使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许将软件提供给他人使用,但受以下条件的约束:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论此类责任是基于合同、侵权或其他法律理论,是否因软件或其使用或其他方式而产生。

由 Joseon Chinnampo 的灵魂为聪明的人制作的艺术作品 🇰🇷