Laravel进阶系列笔记--(二)Laravel服务容器
作者:温新
时间:2021-07-04
hi,我是温新,一名PHPer。
Laravel服务容器是什么
Laravel服务容器是一个用于管理类依赖和执行依赖注入的强大工具。
通过案例理解 管理类依赖和执行依赖注入。为了便于理解,这个案例写有路由文件中。
<span style="box-sizing: border-box; padding-right: 0.1px;">// web.php</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">class</span> <span style="">A</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">function</span> <span style="">__construct</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">echo</span> <span style="">'aaaaaaaa'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span><br></br><span style="padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">class</span> <span style="">B</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">function</span> <span style="">__construct</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">echo</span> <span style="">'bbbbbbbb'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span><br></br><span style="padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">class</span> <span style="">Person</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">$a</span> <span style="">=</span> <span style="">null</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">$b</span> <span style="">=</span> <span style="">null</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">function</span> <span style="">__construct</span>(<span style="">A</span> <span style="">$a</span>, <span style="">B</span> <span style="">$b</span>)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">$this</span><span style="">-></span><span style="">a</span> <span style="">=</span> <span style="">$a</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">$this</span><span style="">-></span><span style="">b</span> <span style="">=</span> <span style="">$b</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span><br></br><span style="padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">Route</span>::<span style="">get</span>(<span style="">'test'</span>, <span style="">function</span>(<span style="">Person</span> <span style="">$person</span>){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>
在这个案例中,Person
依赖于A
、B
,传统的操作就是new
然后将实例当做参数传递给Person
。
在Laravel中可以用更为先进的依赖注入来自动完成,这就解释了Laravel服务容器是一个用于管理类依赖和执行依赖注入的强大工具
。
绑定容器
服务容器需要配合服务提供者来实用,一个类不基于任何接口,这个类就没有必要绑定到容器。
本篇文章只做一个简单的演示,辅助理解。
由于是在web.php
文件中进行演示,那么我们就使用app()
助手函数或者App
门面来绑定。
测试类
<span style="box-sizing: border-box; padding-right: 0.1px;">// web.php</span><br></br><span style="padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">class</span> <span style="">A</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">function</span> <span style="">__construct</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">echo</span> <span style="">'aaaaaaaa'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span><br></br><span style="padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">class</span> <span style="">Person</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">$a</span> <span style="">=</span> <span style="">null</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">public</span> <span style="">function</span> <span style="">__construct</span>(<span style="">$a</span>)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">$this</span><span style="">-></span><span style="">a</span> <span style="">=</span> <span style="">$a</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>
简单绑定
bind
方法用于简单绑定
<span style="box-sizing: border-box; padding-right: 0.1px;">// web.php</span><br></br><span style="padding-right: 0.1px; box-sizing: border-box;"></span><br></br><span style="box-sizing: border-box; padding-right: 0.1px;">// 简单绑定</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">app</span>()<span style="">-></span><span style="">bind</span>(<span style="">'Person'</span>, <span style="">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">return</span> <span style="">new</span> <span style="">Person</span>(<span style="">new</span> <span style="">A</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>
使用
<span style="box-sizing: border-box; padding-right: 0.1px;">// 依赖注入方式</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">Route</span>::<span style="">get</span>(<span style="">'test'</span>, <span style="">function</span>(<span style="">Person</span> <span style="">$person</span>){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span><br></br><span style="box-sizing: border-box; padding-right: 0.1px;">// 解析方式</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="">Route</span>::<span style="">get</span>(<span style="">'test'</span>, <span style="">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">resolve</span>(<span style="">'Person'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>
绑定一个单例方式
方法:singleton
<span style="box-sizing: border-box;padding-right: 0.1px">app()->singleton('Person', function(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> return new Person(new A);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>
解析
make方法
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="">Route</span>::<span style="">get</span>(<span style="">'test'</span>, <span style="">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">app</span>()<span style="">-></span><span style="">make</span>(<span style="">'Person'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>
resolve辅助函数
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="">Route</span>::<span style="">get</span>(<span style="">'test'</span>, <span style="">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="">resolve</span>(<span style="">'Person'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>
关于容器简单的演示就到这里。
我是温新
每天进步一点点,就一点点
请登录后再评论