文档章节

laravel创建服务

tree2013
 tree2013
发布于 2016/03/25 12:18
字数 1036
阅读 113
收藏 2

laravel关于这块的教程很多,

所谓控制反转,就是把该由主类全部完成的事情改由子类去完成,这种设计思路就叫控制反转

实现控制反转有多种方式,工厂模式便是一种比较常见的模式,什么是工厂模式,也就是说父类不需要一个一个去new需要的子类,父类只需要new一次工厂类,由工厂决定子类的依赖,工厂返回类对象,父类直接调用类方法即可。

工厂模式其实已经可以满足我们目前的很多开发方式了,但是也存在一个问题,所有的模块都在工厂类中安排好了,如果有新的类,我们必须去改造工厂。

于是接口的作用就来了,接口是什么,接口是一个类,这个类只有需要实现的方法名字跟入参,并没有方法的定义,继承接口的类必须实现接口的方法才能使用。这样我们就有了更为先进的处理方式了,由接口来规范各个子类的调用,我主类只管去初始化接口就实现了我的全部工作。

class Superman{
    protected $module;

    public function __construct(SuperModuleInterface $module)
    {
        $this->module = $module
    }}

于是,依赖注入的概念就出来了,我们的所有依赖,只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于 依赖注入(DI) 。是不是豁然开朗?事实上,就是这么简单。下面就是一个典型的依赖注入:

// 超能力模组$superModule = new XPower;// 初始化一个超人,并注入一个超能力模组依赖
$superMan = new Superman($superModule);

然后下面就是IoC容器了,我们通过最初的 绑定(bind) 操作,我们向 超级工厂 注册了一些生产脚本,这些生产脚本在生产指令下达之时便会执行,这种就叫IoC容器

实际上,真正的 IoC 容器更为高级。我们现在的例子中,还是需要手动提供超人所需要的模组参数,但真正的 IoC 容器会根据类的依赖需求,自动在注册、绑定的一堆实例中搜寻符合的依赖需求,并自动注入到构造函数参数中去。Laravel 框架的服务容器正是这么做的。实现这种功能其实理论上并不麻烦,但我并不会在本文中写出,因为……我懒得写。不过我告诉大家,这种自动搜寻依赖需求的功能,是通过 反射(Reflection) 实现的

服务提供者

我们在前文介绍 IoC 容器的部分中,提到了,一个类需要绑定、注册至容器中,才能被“制造”。

对,一个类要被容器所能够提取,必须要先注册至这个容器。既然 laravel 称这个容器叫做服务容器,那么我们需要某个服务,就得先注册、绑定这个服务到容器,那么提供服务并绑定服务至容器的东西,就是 服务提供者(ServiceProvider)

虽然,绑定一个类到容器不一定非要通过 服务提供者(ServiceProvider)

但是,我们知道,有时候我们的类、模块会有需要其他类和组件的情况,为了保证初始化阶段不会出现所需要的模块和组件没有注册的情况,laravel 将注册和初始化行为进行拆分,注册的时候就只能注册,初始化的时候就是初始化。拆分后的产物就是现在的 服务提供者

服务提供者主要分为两个部分,register(注册)boot(引导、初始化),具体参考文档。register 负责进行向容器注册“脚本”,但要注意注册部分不要有对未知事物的依赖,如果有,就要移步至 boot 部分。

https://phphub.org/topics/789

© 著作权归作者所有

共有 人打赏支持
tree2013
粉丝 27
博文 194
码字总数 62280
作品 0
武汉
后端工程师
私信 提问
如何使用 Laravel Facades ?

Facade 布局是在面向对象编程中经常使用的一种软件设计布局方式。Facade 实际上是一种包括复杂函数库的类,提供了更加简洁易读的接口。Facade 布局还能为一组结构复杂、设计简陋的 API 提供统...

OneAPM蓝海讯通
2016/01/05
14
0
罗晓俊/laravel-tars

Laravel Tars Driver 中文版 描述 Tars driver for laravel. Laravel集成微服务治理框架Tars 环境依赖 Lumen5.x Tars-PHP 安装 创建项目 创建Tars项目目录结构(scripts、src、tars),Lumen项...

罗晓俊
2018/10/18
0
0
laravel 服务容器实现原理

前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想。 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具。Laravel框架中就是使用服务容器来实现 控制反转 和 ...

技术小牛人
2017/11/14
0
0
Laravel学习笔记之一

1:Laravel的启动 切换到laravel项目下 www/my_laravel 开启laravel服务 php artisan serve 2:快速创建一个laravel控制器/模型 php artisan make:controller NameController; php artisan ......

雨醉风尘
2016/04/17
52
0
在Laravel中创建自己的PHP帮助函数

Laravel 为我们提供了许多内置的帮助函数,你可以在应用程序中的任何位置调用它。它们使你可以方便地处理数组和对象,路径,字符串,URL和其他类型的工作流。 尽管在 Laravel 核心中定义了许...

如来神掌
2018/04/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部