摘要:本文代码什么是依赖注入对象由框架来创建而不是程序员通过创建。解除了调用者与被调用者之间的依赖。的依赖注入通过提供容器特性。灵活使用可以使我们从依赖关系中解脱出来,专注于业务逻辑。
本文代码
https://github.com/xialeistudio/yii2-di-demo
什么是依赖注入(DI)?对象由框架来创建而不是程序员通过 new 创建。跟IoC差不多一个意思。
为什么要有依赖注入?解耦。调用方不再通过 new 运算符实例化被调用对象,而通过框架(IoC容器)创建之后注入进来。解除了调用者与被调用者之间的依赖。
有利于面向接口编程。个人认为OOP程序设计最重要的就是面向接口(面向抽象)编程。因为有了第1步的关系,调用者只需要依赖接口类型而不用依赖实现类型,提高了程序的扩展性。
Yii2的依赖注入Yii2通过 yiidiContainer 提供DI容器特性。目前支持一下4种方式注入:
构造方法注入
方法注入
Setter和属性注入
PHP回调注入
注册依赖关系通过容器的 set 方法注入
通过配置文件注入(推荐)
依赖注入实战
打开终端,执行以下命令初始化项目:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
声明接口业务类 appservicesUserService
接口实现文件 appservicesimplUserServiceImpl
1, "name" => "xialei"], ["id" => 2, "name" => "zhangsan"], ]; public function show($id) { foreach ($this->users as $user) { if ($user["id"] == $id) { return $user; } } return null; } public function all() { return $this->users; } }
注册依赖关系 config/web.php
"basic", "basePath" => dirname(__DIR__), "bootstrap" => ["log"], "aliases" => [ "@bower" => "@vendor/bower-asset", "@npm" => "@vendor/npm-asset", ], "container" => [ "definitions" => [ UserService::class => UserServiceImpl::class ] ], "components" => [ "request" => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation "cookieValidationKey" => "0xGrStOOZE2oXxNNiu-o2eYovJ_Ia1Dk", ], "response" => [ "format" => "json" ], "errorHandler" => [ "errorAction" => "site/error", ], "urlManager" => [ "enablePrettyUrl" => true, "showScriptName" => false, "rules" => [ ], ], ], ]; if (YII_ENV_DEV) { // configuration adjustments for "dev" environment $config["bootstrap"][] = "debug"; $config["modules"]["debug"] = [ "class" => "yiidebugModule", // uncomment the following to add your IP if you are not connecting from localhost. //"allowedIPs" => ["127.0.0.1", "::1"], ]; $config["bootstrap"][] = "gii"; $config["modules"]["gii"] = [ "class" => "yiigiiModule", // uncomment the following to add your IP if you are not connecting from localhost. //"allowedIPs" => ["127.0.0.1", "::1"], ]; } return $config;
添加控制器 appcontrollersUserController
userService = $userService; parent::__construct($id, $module, $config); } public function actionShow($id) { $user = $this->userService->show($id); if (empty($user)) { throw new NotFoundHttpException("用户不存在"); } return $user; } public function actionAll() { return $this->userService->all(); } }
运行测试服务器
./yii serve/index
访问用户列表接口 http://localhost:8080/user/all
[{ "id": 1, "name": "xialei" }, { "id": 2, "name": "zhangsan" }]
访问查看用户接口 http://localhost:8080/user/show?id=1
{ "id": 1, "name": "xialei" }写在最后如你所见,Yii2自带的IoC容器使用起来还是挺方便的,观测了Yii 配置优于编码 的思想,Yii的组件基本上都可以在配置文件中进行配置而不需要手动编码。
灵活使用DI可以使我们从依赖关系中解脱出来,专注于业务逻辑。
当然,业务逻辑的组织也是一个很大的研究课题,有兴趣的可以去看看 DDD(领域驱动设计)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28679.html
摘要:构造器注入实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。 基本概念 1.依赖倒置(反转)原则(DIP):一种软件架构设计的原则(抽象概念,是一种思想)在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于...
摘要:调用方法创建类得实例化对象,实际上又调用了依赖注入容器获取每一个类的实例化对象。依赖注入容器自动解决待实例化类的依赖关系,并返回待实例化类的实例对象。 以下是Yii2源码中,ServiceLocator(服务定位器)与Container(依赖注入容器)的关系解析图。 一句话总结 Application继承了ServiceLocator,是一个服务器定位器,ServiceLocator用...
摘要:反射简介参考官方简介的话,具有完整的反射,添加了对类接口函数方法和扩展进行反向工程的能力。此外,反射提供了方法来取出函数类和方法中的文档注释。 反射简介 参考官方简介的话,PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。 YII2框架中示例 对于yii2框架,应该都知道di容器,...
摘要:前两天发布了使用来运行应用,项目虽然可以运行起来,但是周边的生态如缓存,,日志等等并没有跟上,实际上开发体验比较差。周末研究了一下,把框架集成到了应用上。 前两天发布了使用swoole来运行thrift应用,项目虽然可以运行起来,但是周边的生态(如缓存,ORM,日志等等)并没有跟上,实际上开发体验比较差。周末研究了一下,把Yii2框架集成到了thrift应用上。 项目地址:https:...
摘要:好啦,我们看看在框架的不同版本中是怎么处理攻击,注入等问题的。那要是,又是怎样处理的喃考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导继续阅读 作者:白狼 出处:http://www.manks.top/yii2_filter_xss_code_or_safe_to_database.html 本文版权...
阅读 2814·2021-08-20 09:37
阅读 1591·2019-08-30 12:47
阅读 1073·2019-08-29 13:27
阅读 1672·2019-08-28 18:02
阅读 738·2019-08-23 18:15
阅读 3068·2019-08-23 16:51
阅读 912·2019-08-23 14:13
阅读 2062·2019-08-23 13:05