服务提供者及门面

一.编写一个服务提供类

class Test
{
	public function hello()
	{
		echo ‘hello world‘;
	}

}

  

二.服务提供者

1.生成

artisan make:provider TestServiceProvide

  

2.生成后的代码:

class TestServiceProvide extends ServiceProvider
{
	/**
	* Bootstrap the application services.
	*
	* @return void
	*/
        public function boot()
	{
		//
	}

	/**
	* Register the application services.
	*
	* @return void
	*/
	public function register()
	{

	}
}

  

3.在register中可以绑定服务和对应的类,或者将一个接口绑定到一个类,有三种方法:

a.绑定一个实例:

$instance = new Test();
$this->app->instance(‘TestServiceProvider‘, $instance);

  

b.bind

如果不需要自动依赖,也可以new Test;使用app()帮助函数解决了自动依赖

$this->app->bind(‘TestServiceProvider‘, function($app) {
	return app(Test::class);
});

  

或者

$this->app->bind(‘TestServiceProvider‘, Test::class);

  

如果将bind的第三个参数设置为true,即为共享模式;也就是绑定的服务对应的类是一个单例模式;默认为false

c.绑定一个单例:

$this->app->singleton(‘TestServiceProvider‘, Test::class); //也可以使用闭包或new Test

  

以上绑定中,TestServiceProvider就是这个服务的名字,后面的指明了有那个类来提供服务.这个服务的名字可以随便取,调用服务名字的时候,再去取到对应的类实现.如果这个服务名是一个接口,那么就可以实现依赖注入.

三.注册服务

1.在app/config.php下的providers数组中,添加

Test\Providers\TestServiceProvide::class

  

2.在providers中的AppServiceProvider.php的register方法中添加(这种方式更适合按需加载服务提供者):

$this->app->register(TestServiceProvide::class);

  

四.延迟绑定服务

如果服务不是每次加载都需要,可以提供延迟绑定,在需要的时候再绑定

class TestServiceProvide extends ServiceProvider
{
	protected $defer = true;

	/**
	* Bootstrap the application services.
	*
	* @return void
	*/
        public function boot()
	{
		//
	}

	/**
	* Register the application services.
	*
	* @return void
	*/
	public function register()
	{
		$this->app->singleton(‘TestServiceProvider‘, Test::class);
	}

	public function provides()
	{
		return [‘Test‘];
	}
}

  

五.控制器或其他地方调用

1.依赖注入

2.app(‘TestServiceProvider‘)

六.门面(Facades)

1.门面简化了服务在应用的调用方式,以一种看起来像是静态调用的方式来简化调用,如
Auth::id(),Auth::check()等;

2.我们看看来如何建立一个门面

a.建立一个门面类,继承Facade,重写getFacadeAccessor方法

class TestFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
	// 返回一个服务提供者
        return ‘TestServiceProvider‘;
    }

}

  

b.在app/config.php的aliases添加:

...
‘MyTest‘ => Test\Facades\TestFacade::class, //MyTest是门面的名字,随便取

  

3.使用

use MyTest;
..............
..............

.........
	MyTest::hello();
.........

  

需要说明的是门面对应的服务提供者将实现的是一个单例服务.

总结:

总体而言,如果你不做第三方应用,不做全局的操作,不做接口到类的依赖注入.其实没有必要使用服务提供者.而门面仅仅是对服务调用方式的一种包装罢了.

时间: 2024-10-26 15:20:10

服务提供者及门面的相关文章

laravel门面和服务提供者使用

关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教. 在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用. 这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖,想象一下,如果一个控制器之中引用了很多自定义的类文件的话,那么可以想像会产生多少依赖,所以我们可以使用服务提供者的方式,向laravel的容器内注册类,这样的话,就能够在一个单独的配置文件里面来管理依赖,逻辑和后期

laravel门面与服务提供者区别

laravel门面模式与服务提供者区别 以 Laravel 自带的文件系统为例,在 config/app.php 的配置文件的 providers 数组中,注册了一个服务提供者: Illuminate\Filesystem\FilesystemServiceProvider::class,     在 alias 数组中定义了一个门面: ‘File’ => Illuminate\Support\Facades\File::class,     通过这两个步骤,我们就可以非常方便的使用 Larav

laravel扩展包服务提供者的注册的两种方式

一. 包自动发现 在 Laravel 应用的配置文件 config/app.php 中,providers 配置项定义了一个会被 Laravel 加载的服务提供者列表.当安装完新的扩展包后,在老版本中需要将扩展包的服务提供者添加到这个列表以便被 Laravel 使用.从 Laravel 5.5 开始,我们不必再手动添加服务提供者到该列表,而是将提供者定义到扩展包下 composer.json 文件的 extra 选项中,除了服务提供者之外,我们还可以以这种方式注册门面: "extra"

laravel中的Contracts, ServiceContainer, ServiceProvider, Facades关系

Contracts, ServiceContainer, ServiceProvider, Facades  Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法 ServiceContainer  实现Contracts,具体的逻辑实现 ServiceProvider    ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把它加入到app/config的provider中,会被自动注册到容器

用laravel必备的八大软件包

如今在现代网络开发中,比较流行的模式是基于 API 开发,可以通过手机或网站来创建服务. Laravel 是创建基于 API 的项目的最佳框架之一,它为世界各地的大型社区提供了高速开发. Laravel 内置的项目包括 Composer,允许您添加一些包,使开发更快. 当您决定启动新的基于 API 的项目时,以下几个有用的软件包必须安装. 1.Barryvdh/laravel-debugbar 调试是开发过程中非常重要的一个环节, 通过分析问题,来找到问题,从而解决问题. Laravel deb

Laravel服务/服务提供者/容器/契约和门面

1.服务是什么? 服务是提供了一些功能的类,比如发送邮件,写日志. 2.Laravel服务提供者是什么? 服务提供者中指明了这个提供者可以提供哪些服务(注册服务),以及服务注册后默认调用一些方法(boot). 3.能否不用服务提供者,直接调用服务? 可以,依靠Laravel的依赖注入,你可以方便的调用任何一个服务,而不用服务提供者. 4.既然3成立,那么服务提供者有什么存在的必要? a.利用服务提供者的boot方法,可以做一些全局性的设置,如在boot中对view的composerb.服务提供者

laravel框架之门面(facades)

Facades 为应用程序的服务容器中可用的类提供了一个「静态」接口. Laravel 本身附带许多的 facades,甚至你可能在不知情的状况下已经在使用他们! xpower的静态接口(门面,facades) 前提条件1:我们有一个已经绑定到服务容器的类(xpower) 前提条件2:我们已经在服务提供者中注册这个类(服务容器中regisrer下的singleton方法) 5.接下来创建xpower的facade,都是继承facade基类.必须实现getFacadeAccessor方法.返回了一

门面模式

门面模式[Facade Pattern ] interface LetterProcess{ void writeContent(String content); void fillEnvelope(String address); void LetintoEnvelope(); void sendLetter(); } class LetterProcessImpl implements LetterProcess{ @Override public void writeContent(Str

第 7 章 门面模式【Facade Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,我们继续讲课.大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的呀,信多了还是麻烦,比如到了情人节,为了大海捞针,给十个女孩子发情书,都要这样跑一遍,你不要累死,更别说你要发个广告信啥的,一下子发1 千万封邮件,那不就完蛋了?那怎么办呢?还好,现在邮局开发