- ServiceContainer 实现Contracts,具体的逻辑实现.
- ServiceProvider ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把 它加入到app/config的provider中,会被自动注册到容器中.
- Facades 简化ServiceProvider的调用方式,而且可以静态调用ServiceContainer中的方法.
实现
定义一个ServiceContainer,实现具体的功能
namespace App\Services;
class TestService {
public function teststh($data){
return 'dabiaoge'.$data;
}
}
定义一个ServiceProvider供其他地方使用ServiceContainer
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class TestServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//单例绑定
$this->app->singleton('Test',function(){
return new \App\Services\TestService();
});
//也可以这样绑定,需要先use App;
App::singleton('Test',function(){
return new \App\Services\TestService();
});
}
在app/config.php中的providers数组中加入ServiceProvider,让系统自动注册.
App\Providers\TestServiceProvider::class,
这时候就可以使用了
use App;
public function all( Request $request){
$a='666';
$test=App::make('Test');//
echo $test->teststh($a);
这样太麻烦,还需要用make来获取对象,为了简便,就可以使用门面功能,定义门面TestFacade
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class TestFacade extends Facade
{
protected static function getFacadeAccessor()
{
//这里返回的是ServiceProvider中注册时,定义的字符串
return 'Test';
}
}
在控制器里就可以直接调用了
use App\Facades\TestFacade;
public function all()
{
$a='666';
//从系统容器中获取实例化对象
$test=App::make('Test');
echo $test->teststh($a);
//或者使用门面
echo TestFacade::test($a);
}
【转自 https://segmentfault.com/a/1190000004965752】