最近小侠在和公司的小伙伴奋斗在开发的最前线。什么是最前线?大概中秋我们团队就只休息了24号,其他时间?抱歉乖乖地完成项目和赶进度吧。前些天,在关注项目进度的时候看到了同事在看laravel 的服务提供的相关问题,于是赶紧去八卦打听(ps:说白了就是八卦下看看有什么新技术可以看看,毕竟不断学习才是我们根本的进步捷径)。原来是公司,同事负责的模块可能需要在不同的地方进行调用,而每一次去实例化或者去引入总觉得好不习惯,所以就看看有没有其他好的捷径可以优化这部分的逻辑。于是就找到了服务提供的这个部分。
由于小伙伴没能很好理解和消化这部分所以,作为组长只能身先士卒,撸起袖子加油干。终于在学院君,强大的文档说明下硬是把这块猪骨头给啃下了。在开始正文之前有几个事情需要各位吃瓜的群众好好理解一下先要不然根本没法往下看,因为那些东西都是涉及了laravel的底层知识部分,虽然不需要面面俱到,但起码还是要大概了解是什么的。
什么是容器?
服务容器是用来管理类依赖与运行依赖注入的工具。Laravel框架中就是使用服务容器来实现 “ 控制反转 ” 和 “依赖注入 ”。
什么是控制反转(IoC)和依赖注入(DI)
控制反转(IoC) 就是说把创建对象的“ 控制权” 进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,也就是 Laravel 中的容器。
依赖注入(DI)则是帮助容器实现在运行中动态的为对象提供提依赖的资源
什么是门面?
简单说来就是模拟一个类,提供一个静态魔术方法__callStatic
,并将该静态方法映射到真正的方法上。
相关文章链接
Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
下面我们就直接用代码说话吧!
(1)我们首先创建一个需要绑定到服务容器的Test类:
{public function callMe($controller){return 'Call Me From TestServiceProvider In '.$controller;}
}
这个Test类其实就是你需要注入的服务的逻辑代码,其实这里小侠是简化了一部分,因为正常的情况下,我们还是需要用到契约的,(契约其实说白了就是类的接口)但是为了方面说明与学习我们当前的例子就没有把契约引入。有兴趣的道友可以自己去补充这方面的知识。
(2)通过laravel 自带的服务注入命令,为当前的服务生成一个新的服务注入
php artisan make:provider TestServiceProvider
该命令会在app/Providers目录下生成一个TestServiceProvider.php文件,我们编辑该文件内容如下:
use App\Services\TestService;//需要注入的服务的路径
class TestServiceProvider extends ServiceProvider
{/*** Bootstrap the application services.** @return void*/public function boot(){//}/*** Register the application services.** @return void*/public function register(){//使用singleton绑定单例,其中test名字适用于绑定的别名$this->app->singleton('test',function(){return new TestService();});}
}
绑定容器的方法比较,想了解更多可以参考-[ Laravel 5.5 文档 ] 底层原理 —— 服务容器
(3)注册服务提供者
定义完服务提供者类后,接下来我们需要将该服务提供者注册到应用中,很简单,只需将该类追加到配置文件config/app.php
的providers
数组中即可:
'providers' => [//其他服务提供者App\Providers\TestServiceProvider::class,
],
(4)为对应的方法创建对应的门面
{protected static function getFacadeAccessor(){return 'test'; //其中里面的test需要返回的是你在服务里绑定的名称}
}
再然后需要到配置文件config/app.php
中注册门面类别名:
'aliases' => [...//其他门面类别名映射'TestClass' => App\Facades\TestClass::class,
],
最后在需要调用服务的地方使用对应的门面进行调用即可
use App\Http\Controllers\Controller;
use App;
use TestClass;
class IndexController extends Controller
{
public function index(){$result=TestClass::callMe('TestController');dump($result);
}}
至此,关于laravel的服务注入的实例教程已经全部介绍完毕,感谢各位道友的支持。如果你觉得这文章对你有帮助,希望你也可以点击下关注吧~