355 字
1 分钟

laravel服务提供者和门面及契约整理

2019-02-18
2019-08-07

标签(空格分隔): laravel


服务提供者#

通俗意思是:你家需要水,服务提供者送水的; 服务提供者生成后的代码

Contracts, ServiceContainer, ServiceProvider, Facades关系 概念 Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法

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

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

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

php artisan make:provider FooServiceProvider

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\lib\Tools\FooBar\FooBar;
class FooServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
}
}

其中boot在框架加载初期就载入就提供,如果你提供的水还需要矿物质什么的(框架内一些依赖) 就不要在这里进行提供;

在一个继承服务提供者的文件内 boot方法 register方法都可以使用

$this->app->bind('test',function(){
return new Test();
});

方式提供依赖 这种写法理解思路可以参照:链接

在平时方法中使用:

public function two($id=null){
//从系统容器中获取实例化对象
// $myfoo = app('test');
// app()->make('test');
$myfoo = \App::make('test');
echo $myfoo->get();
}

或在 方法参数中加上依赖地址或名称;

use App\lib\Tools\FooBar\Test;
public function index(Test $test)

根据文章:地址整理思路

门面#

门面定义

namespace App\CustomFacades;
use Illuminate\Support\Facades\Facade;
class Foo extends Facade
{
protected static function getFacadeAccessor()
{
return 'test';
}
}

继承Illuminate\Support\Facades\Facade getFacadeAccessor()中return ‘test’ 代表服务提供者代码中

$this->app->bind('test',function(){
return new Test();
});

的test

在app.php aliases 数组中添加 ‘Foo’ => App\CustomFacades\Foo::class,

契约#

参考网址:https://www.jb51.net/article/135189.htm https://www.cnblogs.com/redirect/p/6087810.html http://laravelacademy.org/post/769.html https://www.cnblogs.com/cyforever/p/6139109.html

laravel服务提供者和门面及契约整理
https://www.motouguai.com/note/laravel-service-provider-and-facade-contract/
作者
Murry
发布于
2019-02-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时