资讯专栏INFORMATION COLUMN

使用Yii2依赖注入简化开发

Luosunce / 3030人阅读

摘要:本文代码什么是依赖注入对象由框架来创建而不是程序员通过创建。解除了调用者与被调用者之间的依赖。的依赖注入通过提供容器特性。灵活使用可以使我们从依赖关系中解脱出来,专注于业务逻辑。

本文代码

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

相关文章

  • Yii2中的依赖注入

    摘要:构造器注入实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。 基本概念 1.依赖倒置(反转)原则(DIP):一种软件架构设计的原则(抽象概念,是一种思想)在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于...

    harriszh 评论0 收藏0
  • 图解Yii2框架依赖注入容器、服务定位器

    摘要:调用方法创建类得实例化对象,实际上又调用了依赖注入容器获取每一个类的实例化对象。依赖注入容器自动解决待实例化类的依赖关系,并返回待实例化类的实例对象。 以下是Yii2源码中,ServiceLocator(服务定位器)与Container(依赖注入容器)的关系解析图。 一句话总结 Application继承了ServiceLocator,是一个服务器定位器,ServiceLocator用...

    AlphaGooo 评论0 收藏0
  • yii2框架中的di容器源码中了解反射的作用

    摘要:反射简介参考官方简介的话,具有完整的反射,添加了对类接口函数方法和扩展进行反向工程的能力。此外,反射提供了方法来取出函数类和方法中的文档注释。 反射简介 参考官方简介的话,PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。 YII2框架中示例 对于yii2框架,应该都知道di容器,...

    dantezhao 评论0 收藏0
  • 在Swoole环境下运行注入Yii2框架的thrift应用

    摘要:前两天发布了使用来运行应用,项目虽然可以运行起来,但是周边的生态如缓存,,日志等等并没有跟上,实际上开发体验比较差。周末研究了一下,把框架集成到了应用上。 前两天发布了使用swoole来运行thrift应用,项目虽然可以运行起来,但是周边的生态(如缓存,ORM,日志等等)并没有跟上,实际上开发体验比较差。周末研究了一下,把Yii2框架集成到了thrift应用上。 项目地址:https:...

    Tony_Zby 评论0 收藏0
  • yii过滤xss代码,防止sql注入教程

    摘要:好啦,我们看看在框架的不同版本中是怎么处理攻击,注入等问题的。那要是,又是怎样处理的喃考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导继续阅读 作者:白狼 出处:http://www.manks.top/yii2_filter_xss_code_or_safe_to_database.html 本文版权...

    Shonim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<