Laravel的“服务容器”和“服务提供者”,哪个是laravel 的核心?

php中文网
发布: 2016-06-06 20:10:12
原创
1217人浏览过

在一些资料中看到说,“服务容器”是laravel 的核心,“服务提供者”也是laravel 的核心。
问题:
1、究竟哪个是核心,还是它们两个组合起来构成了核心?
2、它们两个的关系是什么?
3、它们两个各自的作用是什么的?
4、有“服务容器”,有“服务提供者”,那具体的“服务”在什么地方?打个比方,就是有装饭的锅,有装饭的碗,那饭在什么地方?是在锅里,还是在碗里,还是在田里?

回复内容:

在一些资料中看到说,“服务容器”是laravel 的核心,“服务提供者”也是laravel 的核心。
问题:
1、究竟哪个是核心,还是它们两个组合起来构成了核心?
2、它们两个的关系是什么?
3、它们两个各自的作用是什么的?
4、有“服务容器”,有“服务提供者”,那具体的“服务”在什么地方?打个比方,就是有装饭的锅,有装饭的碗,那饭在什么地方?是在锅里,还是在碗里,还是在田里?

可以去看我的这篇笔记
https://segmentfault.com/a/1190000004965752

摘选

Contracts, ServiceContainer, ServiceProvider, Facades关系

  • Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法

  • ServiceContainer 实现Contracts,具体的逻辑实现

  • ServiceProvider ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把它加入到app/config的provider中,会被自动注册到容器中

  • Facades 简化ServiceProvider的调用方式,而且可以静态调用ServiceContainer中的方法

实现

Contracts接口可以写或不写,这里就不定义了
定义一个ServiceContainer,实现具体的功能

namespace App\Helper;
class MyFoo
{
    public function add($a, $b)
    {
        return $a+$b;
    }
}
登录后复制

定义一个ServiceProvider供其他地方使用ServiceContain

<?php
namespace App\Providers;

use App\Helper\MyFoo; //要服务的Container
use Illuminate\Support\ServiceProvider;
use App;

class MyFooServiceProvider extends ServiceProvider
{
    public function boot(){}
    //注册到容器中
    public function register()
    {
        //可以这么绑定,这需要use App;
        App::bind("myfoo",function(){
            return new MyFoo();
        });
        //也可以这么绑定
        $this->app->bind("myfoo", function(){
            return new MyFoo();
        });
    }
}
登录后复制

在app/config.php中的providers数组中加入ServiceProvider,让系统自动注册

App\Providers\MyFooServiceProvider::class,
登录后复制

这时候就可以使用了,假设在控制器中使用

public function two($id=null)
{
    //从系统容器中获取实例化对象
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
}
登录后复制

这样太麻烦,还需要用make来获取对象,为了简便,就可以使用门面功能,定义门面MyFooFacade

HuiboShop(.NET商城系统)
HuiboShop(.NET商城系统)

慧博网上购物系统是一套自选网上商城精美模版,自主商品管理,自行网店经营的网上商城平台,系统具有强大的商品管理、购物车、订单统计、会员管理等功能,同时拥有灵活多变 的商品管理、新闻管理等功能,功能强劲的后台管理界面,无需登录FTP,通过IE浏览器即可管理整个网站。慧博购物系统经多方面权威调查和研究为您精心开发了很多特色实用功能。使商 品展示、管理、服务全面升级。慧博购物系统为您提供了多款专业美观的店

HuiboShop(.NET商城系统) 0
查看详情 HuiboShop(.NET商城系统)
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class MyFooFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        //这里返回的是ServiceProvider中注册时,定义的字符串
        return 'myfoo';
    }
}
登录后复制

在控制器里就可以直接调用了

use App\Facades\MyFooFacade;
public function two($id=null)
{
    //从系统容器中获取实例化对象
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
    //使用门面
    echo MyFooFacade::add(4,5);
}
登录后复制

总的来说,自定义了一个类,为了方便在其他别处使用,便可以使用服务提供者和门面

Laravel中Container就好似一个大水桶,是核心,每一个Service就好似装满一种饮料的瓶瓶罐罐,Service Provider就好似连接饮料瓶和水桶的插管,可要可不要,直接往水桶里倒也行,虽然这样不讲究。。想去大水桶喝饮料去(一次请求来了),Facade就好似是水瓢帮你从水桶里舀水,当然不要也行直接用手,虽然不卫生,所以Facade可要可不要。

奥,对了,还有一个Contract,主要是为了好管理每一个Service,在碳酸水Service里,那也有分类,可乐百事被一个Contract拴在一起,雪碧美年达被另一个Contract拴在一起,主要也是为了好测试好替换而已。。

总之,Laravel这几个主要概念也就干了这些事,没啥高深的。

如有不全面的请留言。

关于这个推荐一篇博文
laravel 学习笔记 —— 神奇的服务容器

简单的说,“服务容器”就是“服务提供者”提供的服务的容器,“服务容器”通过“服务提供者”来获取服务。

一个laravel应用就是一个“服务容器”,整个框架提供的各种功能由“服务提供者”提供并注入到“服务容器”中。每一个“服务提供者”里register的方法里面使用bind邦定某个对象到一个变量,那个对象就是真正提供服务的对象。

服务容器和服务提供者的核心是降低查询数据库的rps参数 
Laravel的“服务容器”和“服务提供者”,哪个是laravel 的核心?

from https://segmentfault.com/q/1010000000602732

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号