S1开发手册
前言
安装
规范
目录结构
框架
程序执行流程
入口文件
验证架构
验证架构
验证架构
验证架构
验证架构
应用模块
依赖注入
控制器架构
逻辑架构
验证架构
模型架构
行为架构
插件架构
服务架构
数据操作
系统常用配置
系统常用常量
系统常用函数
模块开发
模板制作
基础操作
本文档使用
零起飞
构建
依赖注入
本文最后编辑时间:
2023-08-02 08:54:02
热度:
575
依赖注入(也称之为控制反转)是一种较为轻量的实现,无需任何的配置,并且主要针对访问控制器进行依赖注入。可以在控制器的构造函数或者操作方法(指访问请求的方法)中类型声明任何(对象类型)依赖,这些依赖会被自动解析并注入到控制器实例或方法中 。 代码实例: ```php /** * 控制器层引用业务逻辑层 * 执行查询文章列表逻辑 * 前缀 logic */ $this->logicArticle->getArticleList(); /** * 业务逻辑层引用模型层 * 执行模型查询文章列表 * 前缀 model */ $this->modelArticle->getList(); /** * 业务逻辑层引用验证层 * 执行文章分类数据编辑场景验证 * 前缀 validate */ $this->validateArticle->scene('edit')->check([]); /** * 业务逻辑层引用服务层 * 执行存储服务下的七牛驱动进行文件上传 * 前缀 service | driver */ $this->serviceStorage->driverSms->sms_send(130); ``` 通过代码我们并且没有使用new,也没有引用相关的文件,但是确可以自动使用方法,还能识别是本模块aadmin还是common 从系统架构中我们可以看出,系统的最根控制器是公共控制器ControllerBase,他是继承了tp框架中的Controller控制器,在里面我们创建一个了__get这个方法,这个方法的作用就是当你在获取对象属性时没有找到就会执行这个方法 ```php /app/common/Controller/ControllerBase.php /** * 获取逻辑层实例 */ public function __get($name) { !str_prefix($name, LAYER_LOGIC_NAME) && exception('逻辑层引用需前缀:' . LAYER_LOGIC_NAME); return model(sr($name, LAYER_LOGIC_NAME), LAYER_LOGIC_NAME); } ``` 既然在公共控制器而其他控制器都继承了公共控制器,那么就说明在其他控制器中调用属性找不到就会执行到这里来咯。 $this->logicArticle->getArticleList(); 第一步:this 当然就是当前控制器对象啦,logicArticle 如果自己之前没有在控制器中定义那肯定是找不到咯,所以就执行过来了。 第二步:get 方法中进行了前缀的检测,如果不是 logic 开头则抛出异常提示,若前缀没问题则调用TP的model函数找到逻辑层下的逻辑对象返回。 第三步:打开model函数一路追踪下去会发现根源实际上在Loader类中,而此类中的对象是做了单例模式,意味着在一次生命周期中多次调用实际上是没有new新对象的。 通过上面分析现在就可以理解了为什么可以直接$this->logicArticle就执行进了业务逻辑层,是因为this对象中找不到,就进了get方法,然后通过TP加载的对象,这就是设计上的一个小技巧,以后开发项目中直接$this->前缀+类名 就可以直接当做对象使用。 业务逻辑层也是类似的实现原理,只不过多了验证器等层的识别。
零起飞网络版权所有