Laravel进阶系列笔记--(二)Laravel服务容器

作者: 温新

分类: 【Laravel】

阅读: 1462

时间: 2021-08-10 13:49:16

作者:温新

时间: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依赖于AB,传统的操作就是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>

关于容器简单的演示就到这里。

我是温新

每天进步一点点,就一点点

请登录后再评论