Skip to content

Latest commit

 

History

History
81 lines (65 loc) · 2.3 KB

di.md

File metadata and controls

81 lines (65 loc) · 2.3 KB

依赖注入

框架采用 PHP-DI 组件作为依赖注入容器。

建议项目中使用依赖注入解决依赖问题,具体的可以采用构造函数注入依赖、直接用容器 get/make。

  • 构造函数注入:

    public function __construct(CacheInterface $cache)
    {
        $this->cache = $cache;
        parent::__construct();
    }
  • 容器获取:

    use WecarSwoole\Container;
    ...
    Container::get(IUserRepository::class);

    \WecarSwoole\Container 是一个 Container facade 类:

    /**
     * Container facade
     * Class Container
     * @package WecarSwoole
     */
    class Container
    {
        /**
         * 从容器获取对象。单例模式,只会实例化对象一次
         * @param $name
         * @return mixed
         */
        public static function get($name)
        {
            return Di::getInstance()->get("di-container")->get($name);
        }
    
        /**
         * 同 get,不过 make 每次会重新实例化对象
         * @param $name
         * @param array $parameters
         * @return mixed
         */
        public static function make($name, array $parameters = [])
        {
            return Di::getInstance()->get("di-container")->make($name, $parameters);
        }
    
        /**
         * 设置注入内容
         * @param $name
         * @param $value
         * @return mixed
         */
        public static function set($name, $value)
        {
            return Di::getInstance()->get("di-container")->set($name, $value);
        }
    
        public static function has($name)
        {
            return Di::getInstance()->get("di-container")->has($name);
        }
    }

禁止在 Domain 中直接使用 Container 获取依赖(这样会造成 Domain 对 Container 的依赖),应当通过参数传递依赖

最佳实践:在 Controller 等处理程序中使用 Container::get/make 获取依赖,然后通过参数传递到其他层对象中。

注意:easyswoole 属于常驻进程,除非重启,否则多次请求的 $container 都是同一个,因而 $container->get("ClassName") 在整个进程生命周期获取到的都是同一个对象实例,因而 $container->get() 只能用来获取单例(如 Cache、Logger 等)或者无状态对象,如果不然,则要用 $container->make(),否则会造成数据混乱。

返回