在laravel中,想要把服务绑定到容器一般是用下面的方法,在服务提供者中,常见类似的写法,第一个参数传标识,第二个参数传闭包
但是在 bootstrap/app.php 中有三行代码是这么写的,第一个参数传了一个契约(接口),第二个参数传了一个具体类
问:为什么要这么写呢? 答:为了在依赖注入时,实现解耦
举个例子:
如果需要在控制器中调用自己写的工具类,比如处理字符串的,如何调用呢?
创建一个文件 app/Tools/StringTools.php 注:Tools目录也是自己建的,随便建个啥目录都行,只是为了方便管理
在控制器中调用,正常引入,依赖注入,就可以用了
但是,如果后来处理字符串的工具类换了呢?比如换成了StringUnit类,那就得改这个Template控制器了,像下图这样
如果,之前引入StringTools类的有100个控制器文件呢?挨个改,想想都觉得刺激 ⊙▽⊙.有别的方法吗?有!
1,建一个 app/Contracts/Tools.php 文件,这是个接口文件
2,在 app/Tools/StringTools.php 类中,实现 Tools接口
3,在 app/Providers/AppServiceProvider.php 文件的 register 方法中,进行绑定
4,在控制器中,注入接口,而不是直接注入StringTools类
这时,如果需要把StringTools类换成StringUnit类就很简单了
1,新建StringUnit类,并实现Tools接口
2,更改 app/Providers/AppServiceProvider.php 文件的 register 方法,搞定! ^_^
在 bootstrap/app.php 中的那三个绑定,就是干这个用的